INFO: Abgeschnitten Ergebnisse beim Aufrufen von IDirectorySearch::GetNextRow

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

325189
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Zusammenfassung
MSDN-Dokumentation über die Funktion IDirectorySearch::GetNextRow ist unvollständig. Die Beschreibung des Rückgabewerts S_ADS_NOMORE_ROWS ist false. Dieser Code bedeutet nicht "die aktuelle Zeile ist die letzte Zeile, und bleibt unverändert werden". Sagen Sie stattdessen die Beschreibung sollte "is vorläufig aktuelle Zeile die letzte Zeile", und wenn Sie möchten wissen, ob dies tatsächlich die letzte Zeile, Sie müssen ADsGetLastError aufrufen. "

Für jede fehlgeschlagene Operation legt ADSI einen erweiterte Fehlercode, der ADsGetLastError abgefragt werden kann. Wenn dieser erweiterten Fehler nicht vom Entwickler behandelt wird, kann ein Suchvorgang vorzeitig abschließen, bevor alle Zeilen verarbeitet wurden. Weitere Informationen über das neueste Servicepack für Microsoft Windows 2000 finden Sie die folgende KB-Artikelnummer:
260910Wie Sie das neueste Service Pack für Windows 2000 erhalten
Weitere Informationen
Wenn die Funktion IDirectorySearch::GetNextRow S_ADS_NOMORE_ROWS zurückgegeben wird, es möglicherweise nicht alle Daten vom Server abgerufen. In einigen Fällen wird die S_ADS_NOMORE_ROWS durch GetNextRow -Funktion zurückgegeben, wenn der Server konnte einen Eintrag zu finden, der die Suchkriterien innerhalb eines vordefinierten Zeitraums von zwei Minuten entsprach. Diese Zeitbegrenzung zwei Minuten wird durch eine LDAP-Richtlinie definiert. Weitere Informationen zu LDAP-Richtlinien finden Sie die Artikel der Microsoft Knowledge Base:
315071HOW TO: Einsehen und Festlegen von LDAP-Richtlinien mithilfe von Ntdsutil
Wenn der Server den zwei Minuten Zeit Grenzwert überschreitet, wird einen LDAP-Cookie in der Antwort so, dass Sie die Suche neu starten können, wo unterbrochen. Ineffiziente sucht und stark ausgelasteten Systemen kann den Server die Zeit überschritten. Wenn der Server einen effizienten Index suchen nicht finden kann, der Server eventuell zum Anwenden des Filters auf jedes Objekt in das Verzeichnis, in diesem Fall können Sie über viele Einträge ausführen und eine Übereinstimmung innerhalb des Zeitlimits zwei Minuten nicht gefunden.

Daher wird beim Zurückgeben von S_ADS_NOMORE_ROWS ADSI auch einen erweiterten Fehler-Code mit ADsGetLastError -Funktion abgefragt werden kann. Wenn ADsGetLastError ERROR_MORE_DATA zurückgibt, bedeutet dies, dass der Server die Abfrage nicht abgeschlossen wurde und GetNextRow muss erneut aufrufen.

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);...}				
Informationsquellen
Weitere Informationen finden Sie auf folgenden Websites von MSDN:
IDirectorySearch GetNextRow S_ADS_NOMORE_ROWS ERROR_MORE_DATA ADsGetLastError abgeschnitten

Warnung: Dieser Artikel wurde automatisch übersetzt

Eigenschaften

Artikelnummer: 325189 – Letzte Überarbeitung: 01/17/2015 16:41:39 – Revision: 4.0

  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
  • kbnosurvey kbarchive kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtde
Feedback