INFO : tronquées résultats lors de l'appel IDirectorySearch::GetNextRow

Traductions disponibles Traductions disponibles
Numéro d'article: 325189 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

Documentation MSDN sur cette fonction IDirectorySearch::GetNextRow est incomplète. La description de la valeur renvoyée S_ADS_NOMORE_ROWS est false. Ce code ne signifie pas « la ligne active est la dernière ligne et reste inchangé à ». Au lieu de cela, la description doit dire » pour l'instant, ligne en cours agit la dernière ligne », et si vous voulez savoir si cela est vraiment la dernière ligne, vous devez appeler ADsGetLastError. »

Pour chaque opération a échoué, ADSI définit un code d'erreur étendues, qui peut être interrogé à l'aide de ADsGetLastError. Si ce étendu d'erreur n'est pas géré par le développeur, une opération de recherche peut conclure prématurément avant que toutes les lignes ont été traitées. Pour plus d'informations sur le dernier service pack pour Microsoft Windows 2000, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
260910 Comment faire pour obtenir le dernier Service Pack Windows 2000

Plus d'informations

Lorsque la fonction IDirectorySearch::GetNextRow renvoie S_ADS_NOMORE_ROWS, il peut ne pas avoir extraite toutes les données du serveur. Dans certains cas, S_ADS_NOMORE_ROWS est renvoyée par la fonction de la méthode GetNextRow lorsque le serveur n'a pas pu trouver une entrée qui correspondent aux critères de recherche dans un délai de deux minutes prédéfini. Ce délai de deux minutes est défini au moyen d'une stratégie LDAP. Pour plus d'informations sur les stratégies LDAP, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
315071 Comment faire : afficher et définir des stratégies LDAP à l'aide de Ntdsutil.exe
Si le serveur dépasse la limite de temps deux minutes, elle renvoie un cookie LDAP dans la réponse afin que vous pouvez redémarrer la recherche là où il laissé. Recherches inefficace et systèmes très chargés peuvent provoquer le serveur à dépasser la limite de temps. Lorsque le serveur ne peut pas trouver un index efficace pour effectuer une recherche, le serveur peut-être appliquer le filtre à chaque objet dans le répertoire, dans ce cas il peut exécuter via un grand nombre d'entrées et pas trouve une correspondance dans le délai de deux minutes.

Par conséquent, lorsque vous retournez S_ADS_NOMORE_ROWS, ADSI définit également un code d'erreur étendues, qui peut être interrogé à l'aide de fonction ADsGetLastError . Si ADsGetLastError renvoie ERROR_MORE_DATA, cela signifie que le serveur n'est pas terminée de la requête et doit appeler la méthode 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);
...
}
				

Références

Pour plus d'informations, reportez-vous aux sites Web MSDN aux adresses suivantes :

Propriétés

Numéro d'article: 325189 - Dernière mise à jour: jeudi 12 février 2004 - Version: 4.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Active Directory Service Interfaces 2.5
  • Microsoft Active Directory Service Interfaces 2.5
Mots-clés : 
kbmt kbdswadsi2003swept kbwin2ksp4fix kbinfo KB325189 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 325189
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

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