6
votes

Access VBA QueryDef.execute () Erreur 3420

Un extrait de code très simple ici pose un problème très gênant. Il s'agit d'une section d'un sous-programme plus important, mais les seules informations pertinentes doivent être trouvées ici. XXX PRE>

I Obtenir une erreur 3420 "objet invalide ou non enfoncé" sur cette ligne: p>

CurrentDb.CreateQueryDef


8 commentaires

NE PAS UTILISER DAO! Utilisez ADO à la place. Quelle version de MS Access?


@Maciejlos Re: "N'utilisez pas dao! Utilisez ADO à la place." - mal. Absolument faux.


@Gordthompson, existe-t-il une raison particulière d'utiliser DAO? Voir: PromoAccess.com/wiki/index.php/choose_between_dao_and_ado


@Maciejlos DAO continue d'être la méthode privilégiée d'interaction avec les objets de base de données d'accès des projets VBA dans l'accès lui-même. C'est pourquoi un nouveau projet d'accès VBA aura déjà une référence DAO définie. (Il y a des années, Microsoft a tenté de forcer les développeurs d'accès à adopter ADO, mais que cet effort a échoué et Microsoft s'est rendu à offrir DAO comme référence par défaut.)


Pour un, vous devez ajouter une bibliothèque de référence spécifique pour ADO qui peut ne pas être disponible pour tous les utilisateurs; Microsoft Ado pour DDL et Security


Merci aux gars de votre opinion, mais je dois être en désaccord. Bien sûr, DAO est toujours utilisé dans les bases de données MS Access, mais ADO I Smore Puissant dans mon Opnion. Certaines fonctionnalités de DAO sont toujours utiles, mais Dao est vraiment vieux. Je pense que cela pourrait être des arguments de tonnes d'utiliser ADO et DAO. Peut-être la prochaine fois?


@Maciejlos Re: "Dao est vraiment vieux." - Ace Dao a été mis à jour pour gérer de nouvelles fonctionnalités d'accès plus complètement que OLDEB ou ODBC. Par exemple, le seul moyen fiable d'insérer et d'extraire des documents à partir d'un champ de pièce jointe dans une base de données d'accès se trouve via un objet Ace Dao Field2 objet.


De plus, à partir de la page Maciejlos liée, "Bien que ADO soit censé remplacer DAO, Microsoft a depuis inversé la position et a créé DAO la Bibliothèque de données béniée d'accès. En outre, Microsoft a béni ADO.NET, qui est tout à fait différent. bibliothèque d'accès aux données avec peu en commun à ADO autres que les trois lettres. Ainsi, il est peu probable que ADO reçoive un développement actif. " SO tout le monde est libre de rejeter DAO sur le terrain que " est vraiment Ancien ", mais Microsoft ne l'a pas rejeté.


3 Réponses :


7
votes

Vous obtenez cette erreur car l'objet QueryDef code> que vous créez n'a pas de Nom code> Propriété. Normalement, lorsque nous créons un objet temporaire QueryDef CODE>, nous fournissons la propriété nom code> en tant qu'argument de chaîne vide sur la méthode CreateEquéry CODE>:

Set qdfNewHospital = db.CreateQueryDef
qdfNewHospital.Name = ""


5 commentaires

Et si la question avec le même nom existe déjà dans la base de données? Vous devez supprimer une requête existante avant de la créer à nouveau.


@Maciejlos Objets de QueryDef temporaires (dont le nom est une chaîne vide) ne sont pas enregistrés dans la collection QueryDefS.


@NOW, la réponse est terminée;) Au fait: je savais ça;)


Pour ma requête SELECT, régler .Name = "" "lance" String de connexion non valide dans la requête transparente ". J'ai mis le code avec ... fin


@ user1175126 Veuillez <-href="http://stackoverflow.com/questions/ask"> Poser une nouvelle question y compris les détails pertinents de votre problème, y compris le code que vous essayez d'utiliser.



2
votes

avec DAO, vous pouvez également le faire comme ceci:

Dim sqltext As String
qdfNewHospital As DAO.QueryDef

'  build the create querydef sql  string
sqltext = "INSERT INTO tblHospital (HospitalName)" & _
        " VALUES ('" & hName & "')" 

'  now create a reusable stored query def
On Error Resume Next  

With CurrentDb               
    'Delete the query if it exists
    .QueryDefs.Delete ("My_Query")
    'Now set up the querydef                                
    Set qdfNewHospital = .CreateQueryDef ("My_Query", sqltext)
    .Close
End With


0 commentaires

1
votes

Pour le mettre succinctement, j'avais le même problème. xxx


0 commentaires