2008-09-25 7 views
3

Ceci est une super base question mais j'essaie d'exécuter une requête que je construis via certaines valeurs de formulaire contre la base de données MS Access dans laquelle se trouve le formulaire. Je ne pense pas que je doive passer formellement par ADO , mais peut-être que je le fais.Comment exécuter une requête SQL dynamique contre MS Access 2003 via VBA?

De toute façon, un coup de main serait apprécié. Désolé d'être un n00b. ;)

+0

Pouvez-vous spécifier si vous modifiez les données dans la base de données ou si vous les lisez pour les afficher? J'ai besoin de savoir avant de voter l'une des réponses :) – MarkJ

Répondre

3

Vous pouvez utiliser le code DAO suivant pour interroger un accès DB:

Dim rs As DAO.Recordset 
Dim db As Database 

Set db = CurrentDb 
Set rs = db.OpenRecordset("SELECT * FROM Attendance WHERE ClassID = " & ClassID) 

do while not rs.EOF 
    'do stuff 
    rs.movenext 
loop 

rs.Close 
Set rs = Nothing 

Dans mon cas, ClassID est une zone de texte sur le formulaire.

+0

J'accepterais cette réponse sauf que le bloc If ne fonctionne pas comme exception (je ne pense pas). Il devrait être «si pas rs.EOF Then»? –

+0

Je l'ai édité pour inclure le "not rs.EOF" et le rs.movenext. – jinsungy

0

C'est ce que j'ai fini par trouver qui fonctionne réellement.

Dim rs As DAO.Recordset 
Dim db As Database 

Set db = CurrentDB 
Set rs = db.OpenRecordset(SQL Statement) 

While Not rs.EOF 
    'do stuff 
Wend 

rs.Close 
+0

Vous avez besoin de l'instruction rs.Movenext si vous souhaitez parcourir les enregistrements du jeu d'enregistrements, en supposant que SQL renvoie plusieurs lignes. – jinsungy

+0

Enregistrez-vous un ensemble et utilisez CurrentDb.OpenRecordset(). Il n'est pas nécessaire de créer l'objet de base de données séparé. – Brettski

+0

Je pense que l'exemple de code doit utiliser les meilleures pratiques et CurrentDB.OpenRecordset() dans DAO peut éventuellement laisser une référence d'objet explicite suspendue. Deuxièmement, en tant qu'échantillon de code, c'est l'endroit où vous ouvrez une base de données * différente * de celle en cours, alors comme code d'exemple, je pense que c'est mieux. –

0

Les réponses qui vous ont été données et que vous semblez accepter en boucle dans un jeu d'enregistrements DAO. C'est généralement une méthode très inefficace pour accomplir un texte. Par exemple, ceci:

Set db = CurrentDB() 
    Set rs = db.OpenRecordset("[sql]") 
    If rs.RecordCount > 0 
    rs.MoveFirst 
    Do While Not rs.EOF 
     rs.Edit 
     rs!Field = "New Data" 
     rs.Update 
     rs.MoveNext 
    Loop 
    End If 
    rs.Close 
    Set rs = Nothing 
    Set db = Nothing 

sera beaucoup moins efficace que:

UPDATE MyTable SET Field = "New Data" 

qui peut être exécuté avec:

CurrentDb.Execute "UPDATE MyTable SET Field = 'New Data'" 

Il est très rare que l'on doit faire une boucle Par le biais d'un jeu d'enregistrements, et dans la plupart des cas, une mise à jour SQL sera plus rapide (et entraînera des verrous de lecture/écriture beaucoup plus courts sur les pages de données).

+0

Eh bien, la question ne précise pas qu'une mise à jour est en cours. Peut-être lire des données pour l'affichage? – MarkJ

+0

Afficher dans quoi? Une forme? Si c'est le cas, ce n'est pas la meilleure façon de le faire. Si dans un rapport, ce n'est * vraiment * pas la meilleure façon de le faire. Pour moi "exécuter une requête" signifie "mettre à jour les données via une requête", mais peut-être que je lis l'OP faux. –

+0

En fait, ils ont dit "exécuter une requête": gros Q = grosse différence. Une requête (small q) est un SQL DML SELECT, qui prehap impliquerait un jeu d'enregistrements.Une requête (big Q) est un objet MS Access (pas Jet, pas ACE) qui peut contenir n'importe quelle instruction SQL: SELECT/INSERT/UPDATE/SUPPRIMER SQL DML, même SQL DDL ou SQL DCL. – onedaywhen

0

ici juste au cas où vous vouliez une version ADO:

Dim cn as new ADODB.Connection, rs as new ADODB.RecordSet 
Dim sql as String 

set cn = CurrentProject.Connection 
sql = "my dynamic sql string" 

rs.Open sql, cn ', Other options for the type of recordset to open, adoOpenStatic, etc. 

While Not rs.EOF 
    'do things with recordset 
    rs.MoveNext ' Can't tell you how many times I have forgotten the MoveNext. silly. 
Wend 
rs.Close 
cn.Close 
Set rs = Nothing 
Set cn = Nothing 

DAO et ADO sont très proches de l'utilisation. Vous obtenez plus de contrôle avec DAO et une performance légèrement meilleure avec ADO. Dans la plupart des applications de base de données d'accès que j'ai rencontrées, cela ne fait vraiment aucune différence. Quand j'ai vu une grande différence avec les tables liées. ADO fonctionne souvent mieux.

+0

J'ai trouvé DAO fonctionne plus rapidement avec les bases de données au format Access 97, et ADO avec Access 2000 et supérieur. Je pense que c'est une différence entre le jet 3.5 et le jet 4.0 – MarkJ

Questions connexes