INFO: Truncados resultados quando chamada IDirectorySearch::GetNextRow

Traduções de Artigos Traduções de Artigos
Artigo: 325189 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Documentação da MSDN sobre a função IDirectorySearch::GetNextRow está incompleta. A descrição do valor devolvido S_ADS_NOMORE_ROWS é falsa. Este código não significa "A linha actual é a última linha e permanece seja inalterada". Em vez disso, a descrição deverá indicar "por agora, linha actual é a última linha", e se pretender saber se este facto é a última linha, tem de chamar ADsGetLastError. "

Para cada operação falhada ADSI define um código de erro expandidas, que pode ser consultado utilizando ADsGetLastError. Se este erro expandido não é processado pelo programador, uma operação de procura pode concluir prematuramente antes de todas as linhas foram processadas. Para obter informações adicionais sobre o service pack mais recente para o Microsoft Windows 2000, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
260910Como obter o Service Pack mais recente do Windows 2000

Mais Informação

Quando a função IDirectorySearch::GetNextRow devolve S_ADS_NOMORE_ROWS, poderá não ter obter todos os dados do servidor. Em alguns casos, S_ADS_NOMORE_ROWS é devolvido pela função GetNextRow quando o servidor não conseguiu encontrar uma entrada que correspondem a critérios de procura dentro de um limite de tempo dois minutos predefinido. Este limite de tempo de dois minutos é definido através de uma política LDAP. Para obter informações adicionais sobre políticas LDAP, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
315071COMO: Visualizar e definir políticas LDAP utilizando Ntdsutil.exe
Se o servidor exceder o limite de tempo de dois minutos, devolve um cookie LDAP na resposta para que pode reiniciar a procura onde parou. Procuras ineficaz e sistemas muito carregados podem fazer com que o servidor exceder o limite de tempo. Quando o servidor não consegue localizar um índice eficiente de procurar, o servidor pode ter que aplicar o filtro a todos os objectos no directório, caso em que pode executar através de muitos movimentos e não encontrar uma correspondência no tempo limite dois minutos.

Por conseguinte, quando devolver S_ADS_NOMORE_ROWS, ADSI também define um código de erro expandidas, que pode ser consultado utilizando ADsGetLastError função. Se ADsGetLastError devolve ERROR_MORE_DATA, isso significa que o servidor não concluiu a consulta e tem de chamar GetNextRow novamente.

The Platform SDK sample file, DsSrch, can be modified to handle this search method as shown in the following code sample:
"MAIN.CXX" file
//------------------------------------------------------------------
// 
//  Function:   Q325189_GetNextRow
// 
//  Synopsis:
// 
//------------------------------------------------------------------
HRESULT Q325189_GetNextRow(IDirectorySearch *pDSSearch, ADS_SEARCH_HANDLE hSearchHandle)
{
	HRESULT hr = S_OK;
	DWORD dwADsExtError = ERROR_SUCCESS;
	WCHAR szErrorBuf[512];
	WCHAR szNameBuf[128];

	do
	{
		// Clear ADSI extended error
		dwADsExtError = ERROR_SUCCESS;
		ADsSetLastError(ERROR_SUCCESS, NULL, NULL);

		// Next row
		hr = pDSSearch->GetNextRow(hSearchHandle);
		BAIL_ON_FAILURE(hr);

		// Check ADSI extend error if we got S_ADS_NOMORE_ROWS
		if (S_ADS_NOMORE_ROWS == hr)
		{
			hr = ADsGetLastError(&dwADsExtError, szErrorBuf, 512, szNameBuf, 128);
			BAIL_ON_FAILURE(hr);

			if (ERROR_MORE_DATA != dwADsExtError)
				// All data received
				return ERROR_NO_DATA;
		}

	} while (ERROR_MORE_DATA == dwADsExtError);

	return ERROR_MORE_DATA;

error:
	return hr;
}


//------------------------------------------------------------------
// 
//  Function:   main
// 
//  Synopsis:
// 
//------------------------------------------------------------------
INT _CRTAPI1
main(int argc, char * argv[])
{
...
	// *** MODIFIED FOR Q325189 *** 
	//hr = pDSSearch->GetNextRow(
	//         hSearchHandle
	//         );
	//BAIL_ON_FAILURE(hr);
	hr = Q325189_GetNextRow(pDSSearch, hSearchHandle); 
	// *** EOM ***

	// *** MODIFIED FOR Q325189 *** 
	//while (hr != S_ADS_NOMORE_ROWS && nRows < dwMaxRows) {<BR/>
         BAIL_ON_FAILURE(hr);
	while (nRows < dwMaxRows) {
	// *** EOM ***
        nRows++;

        if (dwNumberAttributes == -1) {
            hr = pDSSearch->GetNextColumnName(
                     hSearchHandle,
                     &pszColumnName
                     );
            BAIL_ON_FAILURE(hr);

            while (hr != S_ADS_NOMORE_COLUMNS) {
                hr = pDSSearch->GetColumn(
                         hSearchHandle,
                         pszColumnName,
                         &Column
                         );

                if (FAILED(hr)  && hr != E_ADS_COLUMN_NOT_SET)
                    goto error;

                if (SUCCEEDED(hr)) {
                    PrintColumn(&Column, pszColumnName);
                    pDSSearch->FreeColumn(&Column);
                }

                FreeADsMem(pszColumnName);
                hr = pDSSearch->GetNextColumnName(
                         hSearchHandle,
                         &pszColumnName
                         );
                BAIL_ON_FAILURE(hr);
            }
            printf("\n");
        }
        else {
            for (DWORD i=0; i<dwNumberAttributes; i++) {
                hr = pDSSearch->GetColumn(
                         hSearchHandle,
                         pszAttrNames[i],
                         &Column
                         );

                if (hr == E_ADS_COLUMN_NOT_SET)
                    continue;

                BAIL_ON_FAILURE(hr);

                PrintColumn(&Column, pszAttrNames[i]);

                pDSSearch->FreeColumn(&Column);
            }
        printf("\n");
        }

	// *** MODIFIED FOR Q325189 *** 
        //hr = pDSSearch->GetNextRow(
        //         hSearchHandle
        //         );
        //BAIL_ON_FAILURE(hr);
		hr = Q325189_GetNextRow(pDSSearch, hSearchHandle); 
	// *** END OF MODIFICATION ***
    }

    wprintf (L"Total Rows: %d\n", nRows);
...
}
				

Referências

Para obter mais informações, visite os seguintes Web sites da MSDN:

Propriedades

Artigo: 325189 - Última revisão: 12 de fevereiro de 2004 - Revisão: 4.0
A informação contida neste artigo aplica-se a:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
Palavras-chave: 
kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 325189
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com