當呼叫 IDirectorySearch::GetNextRow 資訊: 已截斷的結果

文章翻譯 文章翻譯
文章編號: 325189 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

關於 IDirectorySearch::GetNextRow 函式的 MSDN 文件不完整。傳回值 S_ADS_NOMORE_ROWS 描述為 false。 "目前的資料列是最後一個資料列,並保持為未變更",並不表示此程式碼。改,描述應該顯示 「 現在,目前資料列是最後一個資料列 」,您若想知道是否這是真的最後一列必須呼叫 ADsGetLastError"

對於每個失敗的作業 ADSI 設定可以使用 ADsGetLastError 查詢的延伸的錯誤程式碼。如果這延伸錯誤未處理由開發人員搜尋作業可能會在處理所有資料列之前提前推斷。 取得更多資訊有關最新的 Service Pack,Microsoft Windows 2000 按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
260910如何取得最新的 Windows 2000 Service Pack

其他相關資訊

IDirectorySearch::GetNextRow 函式傳回 S_ADS_NOMORE_ROWS 時,它可能不具有所有資料從伺服器擷取。在某些情況下當伺服器找不到符合搜尋準則預先定義的兩分鐘的時間限制內的項目時,S_ADS_NOMORE_ROWS 就會傳回由 GetNextRow 函式。 這兩分鐘的時間限制是透過 LDAP 原則的方式定義。取得更多資訊有關 LDAP 原則按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
315071如何: 檢視及使用 Ntdsutil.exe 設定 LDAP 原則
如果伺服器超過兩分鐘的時間限制,則會傳回 LDAP Cookie 在回應中,這樣您可以重新啟動搜尋它先前離開的地方。 無效率的搜尋和負荷的系統可以導致伺服器超過時間限制。 當伺服器找不到有效率的索引來搜尋時,伺服器可能要將篩選條件套用至該目錄中的每個物件在這種情況下,它便可以執行透過許多項目上,並找不到相符項目在兩分鐘的時間限制內。

因此,傳回 S_ADS_NOMORE_ROWS 時, ADSI 也會設定可以使用 ADsGetLastError 函式被查詢的延伸的錯誤程式碼。如果 ADsGetLastError 傳回 ERROR_MORE_DATA,這表示伺服器尚未完成查詢,並且必須再次呼叫 GetNextRow

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

?考

如需詳細資訊請造訪下列 MSDN 網站:

屬性

文章編號: 325189 - 上次校閱: 2004年2月12日 - 版次: 4.0
這篇文章中的資訊適用於:
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
關鍵字:?
kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:325189
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

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