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
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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

On Demand Webinar: Networking for the Cloud Era

Ready to improve network connectivity? Watch this webinar to learn how SD-WANs and a one-click instant connect tool can boost provisions, deployment, and management of your cloud connection.

Question has a verified solution.

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

In earlier versions of Windows (XP and before), you could drag a database to the taskbar, where it would appear as a taskbar icon to open that database.  This article shows how to recreate this functionality in Windows 7 through 10.
If you need a simple but flexible process for maintaining an audit trail of who created, edited, or deleted data from a table, or multiple tables, and you can do all of your work from within a form, this simple Audit Log will work for you.
Learn how to number pages in an Access report over each group. Activate two pass printing by referencing the pages property: Add code to the Page Footers OnFormat event to capture the pages as there occur for each group. Use the pages property to …
In Microsoft Access, learn different ways of passing a string value within a string argument. Also learn what a “Type Mis-match” error is about.

696 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