INFORMAZIONI: Risultati troncati durante la chiamata IDirectorySearch::GetNextRow

Traduzione articoli Traduzione articoli
Identificativo articolo: 325189 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

Sommario

La documentazione di MSDN sulla funzione IDirectorySearch::GetNextRow Ŕ incompleta. La descrizione del valore restituito S_ADS_NOMORE_ROWS Ŕ false. Questo codice non significa "riga corrente Ŕ l'ultima riga e rimane invariato per". Al contrario, la descrizione deve indicare "per ora, la riga corrente Ŕ l'ultima riga", e se si desidera sapere se questo Ŕ effettivamente l'ultima riga, Ŕ necessario chiamare ADsGetLastError. "

Per ogni operazione non riuscita, ADSI imposta un codice di errore, Ŕ possibile eseguire query utilizzando ADsGetLastError. Se questo errore esteso non Ŕ gestito dallo sviluppatore, un'operazione di ricerca potrebbe concludere in modo anomalo prima dell'elaborazione di tutte le righe. Per ulteriori informazioni sul service pack pi¨ recente per Microsoft Windows 2000, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
260910Come ottenere Windows 2000 Service Pack pi¨ recente

Informazioni

Quando la funzione di IDirectorySearch::GetNextRow restituisce S_ADS_NOMORE_ROWS, non pu˛ avere recuperati tutti i dati dal server. In alcuni casi, S_ADS_NOMORE_ROWS viene restituito dalla funzione il metodo GetNextRow , in quando il server Ŕ stato Impossibile trovare una voce corrispondente ai criteri di ricerca entro un limite di tempo predefinito di due minuti. Questo limite di tempo due minuti Ŕ definito per mezzo di un criterio LDAP. Per ulteriori informazioni sui criteri LDAP, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
315071Procedura: Visualizzare e impostare criteri LDAP utilizzando Ntdsutil.exe
Se il server supera il limite di tempo di due minuti, viene restituito un cookie LDAP nella risposta in modo che Ŕ possibile riavviare la ricerca in cui Ŕ stata interrotta. Ricerche inefficiente e sistemi con caricati elevato Ŕ possono che il server di superare il limite di tempo. Quando il server non trova un indice efficiente per la ricerca, il server abbia applicare il filtro a ogni oggetto nella directory, in questo caso pu˛ eseguire tutte le voci e non trova una corrispondenza nel limite di tempo due minuti.

Di conseguenza, quando viene restituita S_ADS_NOMORE_ROWS, ADSI imposta anche un codice di errore, Ŕ possibile eseguire query utilizzando ADsGetLastError funzione. Se ADsGetLastError restituisce ERROR_MORE_DATA, significa che il server non Ŕ stata completata la query e se deve chiamare il metodo GetNextRow nuovamente.

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);
...
}
				

Riferimenti

Per ulteriori informazioni, visitare i seguenti siti Web MSDN:

ProprietÓ

Identificativo articolo: 325189 - Ultima modifica: giovedý 12 febbraio 2004 - Revisione: 4.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
Chiavi:á
kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 325189
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Dichiarazione di non responsabilitÓ per articoli della Microsoft Knowledge Base su prodotti non pi¨ supportati
Questo articolo Ŕ stato scritto sui prodotti per cui Microsoft non offre pi¨ supporto. L?articolo, quindi, viene offerto ?cosý come Ŕ? e non verrÓ pi¨ aggiornato.

Invia suggerimenti

 

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