Entrar

INFO: Resultados truncados ao chamar IDirectorySearch::GetNextRow

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.

325189
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
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 _CRTAPI1main(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:
IDirectorySearch GetNextRow S_ADS_NOMORE_ROWS ERROR_MORE_DATA ADsGetLastError truncado

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 325189 - Última Revisão: 01/17/2015 16:41:46 - Revisão: 4.0

  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • kbnosurvey kbarchive kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtpt
Comentários