2008-11-14 67 views
0

任何人都可以给我详细的Access vba运行时错误3734。 作为参考我在下面的线程访问vba:运行时错误3734

How to run a loop of queries in access?

Sub plausibt_check() 

Dim rs As DAO.Recordset 
Dim rs2 As ADODB.Recordset 
Dim db As database 
Dim strsql As String 
Dim tdf As TableDef 




Set db = opendatabase("C:\Codebook.mdb") 
Set rs = db.OpenRecordset("querycrit") 

Set rs2 = CreateObject("ADODB.Recordset") 
rs2.ActiveConnection = CurrentProject.Connection 


For Each tdf In CurrentDb.TableDefs ' in this line the error occurs 
+0

发布导致错误的代码。 – xsl 2008-11-14 11:45:15

回答

0

得到它从代码看来,你是在当前数据库中使用ADO,但不保存。运行包含ADO的代码之前,您必须保存。

1

我不明白你要做什么。你为什么使用一个DAO记录集和一个ADO?这完全没有意义。如果您已将查询保存在Access前端,那么即使您的后端是带有ODBC表链接的SQL Server,但使用ADO实际上也没有任何实用性。

在代码中没有循环的证据,所以除非您的代码被循环调用,否则在我看来,KB文章的解释不适用。

我不知道你想要做什么,但是关于打开你的数据库一次而不是循环的每次重复,这点对任何想到它的人来说都是非常明显的。如果你正在运行一个循环,并且在循环的每次重复中反复打开同一个数据库,那么显然该操作属于循环之外。

这将是这样的:

Dim db As DAO.Database 
    Dim qdf As DAO.QueryDef 

    Set db = CurrentDB() 

    For Each qdf in db.QueryDef 
    [do whatever here] 
    Next qdf 

    Set qdf = Nothing 
    Set db = Nothing 

在该代码中,您使用的MDB目前在用户界面中打开,但它并不重要 - 无论数据库你打开和循环遍历它的对象只能在循环外打开一次。

如果您希望让循环处于从主代码调用的子例程中,请将数据库变量作为参数传递给子例程。子程序会是这样的:

Public Sub ProcessQueries(db As DAO.Database) 
    Dim qdf As DAO.QueryDef 

    For Each qdf in db.QueryDef 
     [do whatever here] 
    Next qdf 

    Set qdf = Nothing 
    End Sub 

而且你会认为这样呼吁:

Dim db As DAO.Database 

    Set db = CurrentDB()  
    Call ProcessQueries(db)  
    Set db = Nothing 

现在,如果你坚持要由DAO源数据,然后通过ADO做有它的东西,你有一个DAO循环,里面和ADO循环。因此,您希望在您的DAO循环之外定义ADO连接,而不是在其内部。唯一的例外是,如果您从DAO循环中提取的数据定义了您使用ADO打开的数据库。由于我们不知道你实际上想要完成什么,所以几乎不可能就你的代码中应该改变的内容提供很好的建议。

+0

使用ADO模式有时会很有用。 – Fionnuala 2008-11-16 20:49:53