INFO: Resultados truncados ao chamar IDirectorySearch::GetNextRow

Traduções deste artigo Traduções deste artigo
ID do artigo: 325189 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Documentação do MSDN sobre a função IDirectorySearch::GetNextRow está incompleta. A descrição do valor de retorno S_ADS_NOMORE_ROWS é false. Esse código não significa "A linha atual é a última linha e permanece ser inalterado". Em vez disso, a descrição deve dizer "por enquanto, linha atual é a última linha", e se você desejar saber se isso realmente é a última linha, você precisará chamar ADsGetLastError. "

Para cada operação com falha, ADSI define um código de erro estendidas, que pode ser consultado usando ADsGetLastError. Se esse erro estendido não é tratado pelo desenvolvedor, uma operação de pesquisa 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 abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
260910Como obter o Service Pack mais recente do Windows 2000

Mais Informações

Quando a função IDirectorySearch::GetNextRow retorna S_ADS_NOMORE_ROWS, ele pode não ter recuperado todos os dados do servidor. Em alguns casos, S_ADS_NOMORE_ROWS é retornado pela função GetNextRow quando o servidor não pôde encontrar uma entrada que correspondem os critérios de pesquisa dentro de um limite de tempo dois minutos predefinido. Esse limite de tempo de dois minutos é definido por meio de uma diretiva LDAP. Para obter informações adicionais sobre as diretivas LDAP, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
315071COMO: Exibir e definir diretivas LDAP usando Ntdsutil.exe
Se o servidor excede o limite de tempo de dois minutos, ela retornará um cookie do LDAP na resposta para que você pode reiniciar a pesquisa onde foi deixada. Pesquisas ineficientes 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 para pesquisar, talvez o servidor tenha que aplicar o filtro a cada objeto no diretório, caso em que ele pode executar através de várias entradas e não encontrar uma correspondência dentro do limite de tempo dois minutos.

Portanto, quando retornar S_ADS_NOMORE_ROWS, ADSI também define um código de erro estendidas, que pode ser consultado usando função ADsGetLastError . Se ADsGetLastError retorna ERROR_MORE_DATA, isso significa que o servidor não concluiu a consulta e deve 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 sites da MSDN:

Propriedades

ID do artigo: 325189 - Última revisão: quinta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 325189
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

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