信息: 截断的结果时调用 IDirectorySearch::GetNextRow

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 325189
本文已归档。它按“原样”提供,并且不再更新。
概要
有关 IDirectorySearch::GetNextRow 函数的 MSDN 文档不完整。返回值 S_ADS_NOMORE_ROWS 的说明为 false。 此代码并不意味着"的当前行是最后一行,并仍将保持不变"。而是,说明应该显示"现在,当前行是最后一行",如果要知道是否这确实是最后一行您有呼叫 ADsGetLastError"

对于每个失败的操作 ADSI 设置可使用 ADsGetLastError 查询的扩展的错误代码。如果此扩展错误不处理由开发人员搜索操作可能会认为过早前处理完所有行。 有关最新的 service pack,对于 Microsoft Windows 2000 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
260910如何获取最新的 Windows 2000 服务软件包
更多信息
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 _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);...}				
参考
有关更多的信息,请访问以下 MSDN 网站:
IDirectorySearch GetNextRow S_ADS_NOMORE_ROWS ERROR_MORE_DATA ADsGetLastError 被截断

属性

文章 ID:325189 - 上次审阅时间:01/17/2015 16:41:49 - 修订版本: 4.0

Microsoft Active Directory Service Interfaces 2.5, Microsoft Active Directory Service Interfaces 2.5

  • kbnosurvey kbarchive kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtzh
反馈