INFO: Abgeschnitten Ergebnisse beim Aufrufen von IDirectorySearch::GetNextRow

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 325189 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

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

Informationsquellen

Weitere Informationen finden Sie auf folgenden Websites von MSDN:

Eigenschaften

Artikel-ID: 325189 - Geändert am: Donnerstag, 12. Februar 2004 - Version: 4.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
Keywords: 
kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtde
Maschinell übersetzter Artikel
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.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 325189
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns

 

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