ADO equivalent of DAO QueryDef object

Posted on 2006-07-22
Last Modified: 2008-02-01
i am a good DAO coder.  but this new project requires that i learn ADO.
how do you say the following in ADO?

Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("qryMyQuery")
qdf.SQL = "SELECT * FROM [MyTable] WHERE [MyField] = 1;"
DoCmd.OpenReport ("rptMyReport"), acPreview
Set qdf = Nothing

Question by:MacRena
  • 3
  • 2
LVL 44

Expert Comment

by:Leigh Purvis
ID: 17161492
Things like this are more a tad more "faffy" in ADO.  (IMHO)
Not ADO's fault - DAO was born to work with Jet data and understands Access objects so well.

You'll have to add the ADOX library (ADO's data definition library - not all in one as it is with DAO).
(I suppose you could use late binding to get around that requirement).

Here's a general function for you to change the SQL of a querydef object using ADO.
(Assumes query is in the same mdb of course - your example above it so this should be fine ;-)

You can just call it like
AlterQdfADO "qryMyQuery", "SELECT * FROM [MyTable] WHERE [MyField] = 1;"

Sub AlterQdfADO(strQuery As String, strSQL As String)
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command
    Set cat.ActiveConnection = CurrentProject.Connection
    Set cmd = cat.Procedures(strQuery).Command
    cmd.CommandText = strSQL
    Set cat.Procedures(strQuery).Command = cmd
    Set cmd = Nothing
    Set cat = Nothing
End Sub

Author Comment

ID: 17161574
hey there, LPervis.
thanks.  i forgot to mention that i have ADO 2.6 selected.
i can't find ADOX but i think you're referring to ADO Ext. 2.8 for DDL and Security?

it breaks on the line
   Set cmd = cat.Procedures(strQuery).Command
with the following error:
   Item cannot be found in the collection corresponding to the requested name or ordinal.

but the query that strQuery represents ("qryTrackingGroupMilestones_subform") exists and is spelled correctly.

*********  here's my code  **********
Option Compare Database
Option Explicit

Private Sub Form_Current()
    Dim cmd As New ADODB.Command
    Dim cat As New ADOX.Catalog
    Dim strQuery As String
    Dim strSQL As String
    Dim lngI As Long

    strQuery = "qryTrackingGroupMilestones_subform"
    lngI = Nz(Me.Parent!sfmTrackingGroup.Form!txtHiddenID, 0)
    If lngI <> 0 Then
        strSQL = "SELECT * FROM [tblTrackingGroupMilestones] WHERE ("
        strSQL = strSQL & "([ID] = " & lngI & ")"
        strSQL = strSQL & ");"
        Set cat.ActiveConnection = CurrentProject.Connection
        Set cmd = cat.Procedures(strQuery).Command   '<--- breaks here
        cmd.CommandText = strSQL
        Set cat.Procedures(strQuery).Command = cmd
    End If
    Set cmd = Nothing
    Set cat = Nothing
End Sub

*******  end code  ******
LVL 44

Accepted Solution

Leigh Purvis earned 100 total points
ID: 17161680
Sorry I forgot to give the full name for the ADOX library yes.

The distinction between types of queries is relevant.
If your query doesn't update data and takes no parameters then even though it's all the same to Access (and hence DAO) in ADO that is enough to classify it as a View.

So instead of reading and updating the
collection, you'd work with
in exactly the same way.  Give it a try.

Author Comment

ID: 17163359
error's gone, function works.  you're my hero yet again!
i'll award the points now.  if you feel like it, can you explain when the cat.Procedures would be used? in other words, would i use cat.Procedures if i wanted to create an updatable recordset?
thanks so much,
LVL 44

Expert Comment

by:Leigh Purvis
ID: 17167273
It helps to think of it terms of a server database (which ADO excels at IMO).

Access queries combine some of the functionality that would be provided by Stored Procedures as well as simple Views.
So anything that performs a data update - or any SELECT statement that takes parameters would be considered to fall under the Procedures banner.
And more standard SELECT statements would come under Views.

You could quite easily combine a check for both into one procedure - and just use the appropriate collection.
(Error handling can be a good friend :-)

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Adding New Records into SQL Server Table from MS Access 4 30
Auto Filter in Combo Box 7 32
combine ShipTo and BillTo Address 3 22
Run Time Error 3071 26 37
This article is a continuation or rather an extension from Cascading Combos ( and builds on examples developed in detail there. It should be understandable alone, but I recommend reading the previous artic…
Experts-Exchange is a great place to come for help with solutions for your database issues, and many problems are resolved within minutes of being posted.  Others take a little more time and effort and often providing a sample database is very helpf…
Familiarize people with the process of utilizing SQL Server stored procedures from within Microsoft Access. Microsoft Access is a very powerful client/server development tool. One of the SQL Server objects that you can interact with from within Micr…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now