Solved

ADO equivalent of DAO QueryDef object

Posted on 2006-07-22
5
1,011 Views
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

thanks,
mac
0
Comment
Question by:MacRena
  • 3
  • 2
5 Comments
 
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
0
 
LVL 4

Author Comment

by:MacRena
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  ******
0
 
LVL 44

Accepted Solution

by:
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
cat.Procedures
collection, you'd work with
cat.Views
in exactly the same way.  Give it a try.
0
 
LVL 4

Author Comment

by:MacRena
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,
mac
0
 
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 :-)
0

Featured Post

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Suggested Solutions

When you are entering numbers in a speadsheet, and don't remember what 6×7 is, you just type “=6*7" instead. It works in every cell! This is not so in Access. To enter the elusive 42 in a text box, you have to find a calculator, and then copy the re…
As tax season makes its return, so does the increase in cyber crime and tax refund phishing that comes with it
Basics of query design. Shows you how to construct a simple query by adding tables, perform joins, defining output columns, perform sorting, and apply criteria.
In Microsoft Access, learn the trick to repeating sub-report headings at the top of each page. The problem with sub-reports and headings: Add a dummy group to the sub report using the expression =1: Set the “Repeat Section” property of the dummy…

776 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