2010-06-29 2 views
1

J'ai une requête très simple qui ne renvoie qu'un seul enregistrement. Lorsque j'essaie d'extraire la valeur de la seule colonne dans le seul enregistrement, j'obtiens que "BOF ou EOF est vrai, ou que l'enregistrement en cours a été supprimé." L'opération demandée nécessite un enregistrement en cours. " Que se passe t-il ici? Le code qui provoque l'erreur ne s'exécute même pas si RecordCount est 0 et j'ai vérifié que le jeu d'enregistrements contient en fait un enregistrement.Pourquoi recordset.RecordCount est-il égal à 1 mais recordset.EOF et recordset.BOF à égalité True

Le code est ci-dessous. Une erreur est générée lorsque vous essayez de définir strDN. C'est tellement simple mais je n'arrive pas à comprendre où je me trompe.

À ÉDITÉ par le commandement

<LDAP://DC=something,DC=com>;(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(employeeID=));distinguishedName;subtree 

Set adoRecordset = adoCommand.Execute 


    If adoRecordset.RecordCount > 0 Then 


     strDN = adoRecordset.Fields("distinguishedName").Value 

     Set objUser = GetObject("LDAP://" & strDN) 

     objGroup.add(objUser.ADsPath) 

    End if 
+0

J'ai modifié ma question. La commande est incluse dans le code ci-dessus. – res

Répondre

5

La propriété recordcount laisse le curseur à la fin du jeu d'enregistrements, de sorte que vous ne pouvez pas alors obtenir le dossier (EOF = true), vous devez bouger d'abord. Utilisez un autre type de curseur, car le type de curseur par défaut est avant seulement:

'' Assign cursorType that allows forward and backward movement. 
adoRecordset.cursorType = 3 ''adOpenStatic 

Voir https://www.w3schools.com/asp/prop_rs_cursortype.asp

0

-Edit- Jetez un oeil sur le lien suivant. Il y a des causes énumérées, et des solutions pour la plupart d'entre eux:

http://classicasp.aspfaq.com/general/why-do-i-get-bof-or-eof-errors.html

[J'ai eu tort à ce sujet - merci, Dave] Je crois que vous devez appeler adoRecordset.MoveNext (ou quel que soit l'appel) avant essayer d'obtenir la valeur d'un champ dans le jeu d'enregistrements.

+0

Si je fais cela, je reçois la même erreur, il est juste jeté sur le adoRecordset.MoveNext au lieu de quand je définis strDN – res

+0

ADO en ASP & vbScript lit automatiquement le premier enregistrement, contrairement au lecteur ADO en .NET – Dave

3

J'utilise

If Not adoRecordset.EOF And Not adoRecordset.BOF Then 
... 
End If 

Pour ce scénario

+0

Ceci est probablement le meilleur façon de vérifier si au moins un enregistrement est trouvé. La propriété RecordCount se comporte différemment selon le type de curseur. –

+0

Eh bien, je n'ai absolument aucune idée de pourquoi cela fonctionne, mais si j'utilise BOF et EOF au lieu de RecordCount pour vérifier la présence d'un enregistrement, tout fonctionne bien. Merci de votre aide! – res

+0

voir la réponse de remou pour savoir pourquoi cela résout le problème. – Jason

0

Essayez

Set adoRecordset = adoCommand.Execute  

    If adoRecordset.RecordCount > 0 Then 

     adoRecordset.MoveFirst 'Move to the first record 

     strDN = adoRecordset.Fields("distinguishedName").Value 

     Set objUser = GetObject("LDAP://" & strDN) 

     objGroup.add(objUser.ADsPath) 

    End if 
+0

J'ai essayé cela mais j'ai la même erreur, c'est juste jeté sur adoRecordset.MoveFirst – res

+0

@res: Quel type de curseur utilisez-vous? Voir la réponse de Remou. Vous devez utiliser un curseur en avant et en arrière. – Tester101

0

Appel adoRecordSet.Requery() après la demande RecordCount peut également aider dans cette situation, si votre requête est pas complexe à exécuter c'est la deuxième fois.

Questions connexes