INFORMACE: Výsledky zkráceny při volání IDirectorySearch::GetNextRow

Překlady článku Překlady článku
ID článku: 325189 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Dokumentace MSDN o funkci IDirectorySearch::GetNextRow je neúplný. Popis S_ADS_NOMORE_ROWS vrácená hodnota je false. Tento kód neznamená "aktuální řádek je poslední řádek a zůstane nezměněn být". Místo toho by popis vyslovte „ prozatím aktuální řádek je poslední řádek „, a pokud chcete vědět, pokud je skutečně poslední řádek, máte volání ADsGetLastError. "

Pro každou operaci se nezdařilo nastaví ADSI kód rozšířené chyby, který může být dotazován pomocí ADsGetLastError. Pokud není tento rozšířený chyba zpracováno vývojářem, vyhledávací operace pravděpodobně ukončuje předčasně před zpracováním všech řádků. Další informace o nejnovější aktualizaci service pack pro systém Windows 2000 klepněte na následující číslo článku databáze Microsoft Knowledge Base:
260910Jak získat nejnovější aktualizaci Service Pack pro systém Windows 2000

Další informace

Když vrátí funkce IDirectorySearch::GetNextRow S_ADS_NOMORE_ROWS, ji může nebude mít načíst všechna data ze serveru. V některých případech je S_ADS_NOMORE_ROWS vrácené funkcí GetNextRow při server nemůže najít položku, která odpovídá kritéria vyhledávání v rámci předdefinované časový limit dvě minuty. Tato dvě minuty časový limit je definována prostřednictvím služby zásady LDAP. Další informace o zásady LDAP klepněte na článek číslo článku databáze Microsoft Knowledge Base:
315071Postupy: Zobrazení a nastavení zásady LDAP pomocí Ntdsutil.exe
Pokud server překročí časový limit dvě minuty, vrátí soubor cookie LDAP v odpovědi tak, že restartování hledání kde vlevo. Neefektivní vyhledávání a intenzivně načten systémů může způsobit serveru překročí časový limit. Při efektivní indexu vyhledávání nelze najít server, server pravděpodobně nutné použít filtr každý objekt v adresáři, v tomto případě lze spustit prostřednictvím mnoho položek a není najít shodu v rámci časového limitu dvě minuty.

Proto při vrácení S_ADS_NOMORE_ROWS ADSI nastaví také kód rozšířené chyby, který může být dotazován pomocí funkce ADsGetLastError. ADsGetLastError vrátí ERROR_MORE_DATA, znamená to, že server dokončil dotazu a musí GetNextRow zavolejte znovu.

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

Odkazy

Další informace naleznete na následujících webech MSDN:

Vlastnosti

ID článku: 325189 - Poslední aktualizace: 12. února 2004 - Revize: 4.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
Klíčová slova: 
kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:325189
Právní omezení pro obsah znalostní báze týkající se produktů, jejichž podpora byla ukončena
Tento článek byl napsán o produktech, pro které společnost Microsoft již neposkytuje nadále podporu. Článek je tedy nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.

Dejte nám zpětnou vazbu

 

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