7
votes

Comment remplir une liste de liste avec un ADODB.Recordset (Erreur 91) pour effectuer une autoocompleure dans l'accès

Je travaille sur un accès à db et je dois utiliser une connexion de données à un serveur SQL.

Pour faire pour cela, j'utilise l'objet Adodb avec:

-Adodb.Connection

-adodb.recordsetset

Code à jour, à la suite d'une observation de Ian Kenney xxx < / pré>

(Ce code (une partie du code) est un moyen de faire une autocomplietion dans l'accès à une zone de texte et une liste de liste)

et j'ai une erreur 91 lorsque j'exécute ce code : "Erreur 91: variable d'objet ou avec une variable de bloc non définie".

Je ne comprends pas comment résoudre ce problème.

Merci d'avance.


0 commentaires

3 Réponses :


4
votes

Vous avez fermé le jeu d'enregistrements et la connexion avant de l'utiliser

rs fermé ici xxx

et la connexion est fermée Ici xxx

rs utilisé ici xxx

< / fort> Du Docs :

Utilisation de la méthode de fermeture pour fermer un objet de connexion ferme également tout Objets d'enregistrement actifs associés à la connexion. Une commande objet associé à l'objet de connexion que vous ferme vous fermez persistez, mais cela ne sera plus associé à un objet de connexion; C'est-à-dire que sa propriété ActiveConnection ne sera définie sur rien. Aussi, La collection Paramètres de l'objet de commande sera effacée de tout Paramètres définis par le fournisseur.

Utilisation de la méthode de fermeture pour fermer un jeu d'enregistrements, d'enregistrement ou de flux libère les données associées et tout accès exclusif que vous ayez peut-être eu aux données via cet objet particulier. Vous pouvez ensuite appeler le Ouvrir la méthode pour rouvrir l'objet avec le même ou modifié, les attributs. Bien qu'un objet d'enregistrement soit fermé, appelez toutes les méthodes qui nécessite un curseur en direct génère une erreur.

Injection SQL Il y a aussi un Injection SQL Risque en construisant SQL directement à partir de l'entrée de l'utilisateur.
Cette question ( Les instructions préparées par MS Access ) indique comment utiliser une requête paramétrée - pourrait valoir un look.


6 commentaires

Ce n'est pas la raison de l'erreur, quand je déplace le rs.close et cnn.close sous me.liste_choix.recordset = Rs, j'ai déjà eu l'erreur.


Avez-vous essayé de déplacer le RS.close / cnn.close à après avoir utilisé le jeu d'enregistrement?


Oui ... me.liste_choix.rowsourcetype = "table / liste" me.liste_choix.recordset = Rs Rs.Close cnn.close


L'élément Adodb.Connection est différent de l'objet Dao.Database ... et je dois utiliser cet élément Adodb en raison de la connexion de DataSource à un serveur SQL.


Bien en supposant que vous avez vérifié la connexion ouverte OK et que le jeu d'enregistrement a quelques données dans, que me.textbox_recherche.text et me.liste_choix sont des contrôles valides, alors je ne pense pas que je puisse vous aider beaucoup plus, car je n'ai pas accès à main.


Ce Video vous promène à travers des moyens de déboguer le code d'accès - pourrait vous aider



7
votes

Vous nous avez dit que le code jette une erreur 91, "" objet variable ou avec une variable de bloc non définie ". Malheureusement, vous n'avez pas indiqué quelle ligne déclenche l'erreur. Cela nous oblige à deviner où le problème réside.

Un problème est ici: xxx

qui tente une attribution d'un objet à un autre. Le signe = est suffisant pour les affectations avec des types de données simples ... IE myvariable = 2 . Cependant, vous devez inclure le mot-clé définir avec des assignations d'objet. xxx

Bien que vous devriez faire ce changement, je ne suis pas certain que c'était la cause de Erreur 91; J'aurais deviné l'accès se plaindre "Utilisation non valide de la propriété" à la place.

Le Sélectionnez l'instruction est un autre problème, mais je suis encore incertain si cela contribue à l'erreur que vous avez signalée. Le clause utilise un comme de comparaison avec un motif qui a * comme caractère de carte sauvage. Cette requête pourrait retourner ce que vous attendez quand vous l'exécutez de Dao. Mais vous utilisez ADO qui traite * comme un seul caractère d'astérisque sans aucune signification particulière. Donc, cette requête ne renvoie probablement aucune lignée lorsque vous l'exécutez d'ADO. Remplacer * avec % .

comme un conseil général, si votre module de code n'inclut pas déjà option explicite dans ses déclarations section, ajoutez-le. Ensuite, exécutez le débogage-> Compilez du menu principal de l'éditeur VB. Réparer tout ce que le compilateur se plaint de. Assurez-vous d'avoir fait ces choses avant tout dépannage supplémentaire.


1 commentaires

Merci, je vous donne la prime mais je pense qu'un problème important est la façon de déclarer l'objet Adodb.Connection. Nous devons déclarer cet objet avec .properties (je ne sais pas exactement pourquoi ...) comme dans ma réponse ...



8
votes

J'ai résolu mon problème (Erreur 91), il y avait trois problèmes: la création de l'adodb.Connection, le * dans le SELECT (merci à hanansup) et le jeu pour la listeBOX.Recordset (grâce à Hansup à nouveau) < p> J'ai résolu l'erreur: xxx


0 commentaires