If you are not a paid subscriber, you must have signed up for our free trial at http://www.codeoftheweek.com. Our ezine is not an unsolicited message (in other words a spam email). Keep in mind that if you signed up for our free trial you can still receive a total of four issues at no cost to you. After you receive the four issues you will be notified about continuing your subscription.
If you do not wish to continue to receive this ezine, please email us at cancel@codeoftheweek.com
The source code in this issue is designed for Visual Basic 5.0 32-bit and above. It will work in VB 4.0 with small changes to the error handlers and the parameters in the CopyQuery function. It is geared towards the intermediate to advanced programmer.
If you have any questions about this issue, please email us at questions@codeoftheweek.com
This issue introduces a routine to copy a Microsoft Access query from one database to another. It will also work with any databases that support the QueryDef object and the QueryDefs collections.
Public Sub CopyQuery(sQueryName As String, sSourceDB As String, sDestinationDB As String, Optional bOverwrite As Boolean = False)
Nothing unless an error occurs. If any error occurs it will be raised to the caller.
This example shows how to use the CopyQuery subroutine. The first example will copy the query called rpt11 from the src.mdb to the dest.mdb. The second will copy rpt12 from src.mdb to dest.mdb. If the query rpt12 exists in dest.mdb it will automatically be overwritten.
CopyQuery "rpt11", "e:\temp\src.mdb", "e:\temp\dest.mdb"
CopyQuery "rpt12", "e:\temp\src.mdb", "e:\temp\dest.mdb", True
Just paste this source code into a module called basQueries and include it in your project.
'----------------------------------------------------------------------
'
' Class Name: basQueries
' Written By: C&D Programming Corp.
' Create Date: 5/98
' Copyright: Copyright 1998 by C&D Programming Corp. Source
' code may not be reproduced except for use in a
' compiled executable. All rights reserved. If
' you would like to reprint any or all of this
' code please email us at info@codeoftheweek.com
'----------------------------------------------------------------------
Option Explicit
'
' Deletes a query from the specified database
'
Public Sub DeleteQuery(sQueryName As String, db As Database)
On Error GoTo Handler
db.QueryDefs.Delete sQueryName ' remove query
Exit Sub
Handler:
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
'
' Returns the QueryDef object of the specified query in the specified database
' If it is not found in the database the routine returns Nothing
'
Public Function FindQuery(sQueryName As String, db As Database) As QueryDef
Dim qry As QueryDef
On Error GoTo Handler
' We could also access the named query by setting an error handler
' and calling the item property with the query name. We opted for
' this "cleaner" method.
For Each qry In db.QueryDefs ' search querydef collection
If qry.Name = sQueryName Then
Set FindQuery = qry ' return querydef
Exit Function
End If
Next
Set FindQuery = Nothing ' clean up
Exit Function
Handler:
Err.Raise Err.Number, Err.Source, Err.Description
End Function
'
' Copies a query from one database to another with an optional
' automatic overwrite.
'
Public Sub CopyQuery(sQueryName As String, sSourceDB As String, sDestinationDB As String, Optional bOverwrite As Boolean = False)
Dim qry As QueryDef
Dim qryNew As QueryDef
Dim sMsg As String
Dim dbSource As Database
Dim dbDest As Database
Set dbSource = DBEngine.OpenDatabase(sSourceDB) ' open database
Set qry = FindQuery(sQueryName, dbSource) ' get the source query object
If qry Is Nothing Then
' could not find query in source table so let's just get out of here.
' should probably raise an error or something. We'll leave this up
' to your particular implementation of this routine.
dbSource.Close
Exit Sub
End If
Set dbDest = DBEngine.OpenDatabase(sDestinationDB) ' open database
Set qryNew = FindQuery(sQueryName, dbDest) ' see if the dest query exists
If Not qryNew Is Nothing Then ' This means we found the query.
If bOverwrite Then ' if we should auto overwrite, just delete the query
DeleteQuery sQueryName, dbDest
Else ' otherwise notify the user and let them decide
If qry.SQL = qryNew.SQL Then
sMsg = "The contents of the queries are identical."
Else
sMsg = "The contents of the queries are different."
End If
If MsgBox("The query " & sQueryName & _
" already exists in the destination database." & _
vbCr & vbCr & _
"The source query was last updated on " & _
qry.LastUpdated & vbCr & _
"The destination query was last updated on " & _
qryNew.LastUpdated & vbCr & _
sMsg & vbCr & vbCr & _
"Do you want to replace the query in the destination database?", _
vbYesNo Or vbExclamation) = vbYes Then
DeleteQuery sQueryName, dbDest
Else
Set qry = Nothing
Set qryNew = Nothing
dbDest.Close
Exit Sub ' we don't want to overwrite the query.
End If
End If
End If
Set qryNew = dbDest.CreateQueryDef(qry.Name, qry.SQL) ' copy query
Set qry = Nothing
Set qryNew = Nothing
dbDest.Close ' close db
dbSource.Close
Exit Sub
Handler:
Err.Raise Err.Number, Err.Source, Err.Description
End Sub
That concludes this issue of COTW. We hope you find the source code useful in your development.
The below describes the ways you can supply us some feedback about COTW. We would like to see our members help mold COTW into the best Visual Basic source code resource available. But to do that we need your feedback about what you like and what you do not like about COTW.
If you are interested in advertising in COTW please email us at sponsor@codeoftheweek.com Our rates are VERY reasonable, actually they are almost FREE. We reach over three thousand Visual Basic developers each week.
If you have any suggestions for topics you would like to see covered or questions about this issue, please email them to info@codeoftheweek.com or use online feedback form at http://www.codeoftheweek.com/feedback.html.
If you have any source code you would like to submit for possible inclusion in COTW, please fill out our online submission form at http://www.codeoftheweek.com/submission.html.
Thank you for trying Code of the Week for Visual Basic.
Your free trial expires after you receive your fourth issue. If you want to continue to receive Code of the Week you can get 52 issues of COTW for only $19.95. This is a full year of Visual Basic source code and information to help with all your development. So don't wait, subscribe now! The quickest way to subscribe is to jump to our online order form at http://www.codeoftheweek.com/order.html