Ms access 在VBA中将Access查询类型从直通(ODBC)查询动态更改为常规选择查询
我感兴趣的是动态使用MicrosoftAccess查询,有时作为使用ODBC访问远程SQL Server的传递查询,有时作为本地Select查询访问同一Access数据库中的表。但是,QueryDef.Type属性是只读的,我不知道如何更改它 所以在代码中它看起来像:Ms access 在VBA中将Access查询类型从直通(ODBC)查询动态更改为常规选择查询,ms-access,vba,ms-access-2013,Ms Access,Vba,Ms Access 2013,我感兴趣的是动态使用MicrosoftAccess查询,有时作为使用ODBC访问远程SQL Server的传递查询,有时作为本地Select查询访问同一Access数据库中的表。但是,QueryDef.Type属性是只读的,我不知道如何更改它 所以在代码中它看起来像: Dim qd As DAO.QueryDef Set qd = CurrentDB.QueryDefs("qrySubForm1") 'this line turns the qd.Type property to dbQSQL
Dim qd As DAO.QueryDef
Set qd = CurrentDB.QueryDefs("qrySubForm1")
'this line turns the qd.Type property to dbQSQLPassThrough automatically I believe
qd.Connect = "ODBC;--connectionstring--"
qd.SQL = "Select * from SomeRemoteTable"
'populate the subform with the results of the Pass Through query
SubForm1.SourceObject = "Query.qrySubForm1"
'Intent: change to regular select query.
qd.Type = dbQSelect ' Error: read-only property
qd.SQL = "Select * from ALocalTable"
' now change the SubForm to show results of the local query
SubForm1.SourceObject = "Query.qrySubForm1"
QueryDef Type属性是枚举中的值之一
如果我在两个本地查询之间切换,或者在两个直通查询之间切换,效果会很好。只有当我尝试在直通查询和本地查询之间切换时,我才会遇到问题
更新:
对另一个SO问题的回答似乎建议我可以向查询定义中添加属性,但我不确定这是否适用于“Type”的情况。正确的方法是删除并创建QueryDef 在更改为本地表之前添加以下内容:
DoCmd.DeleteObject acQuery, qd.name
Set qd= MyDB.CreateQueryDef(qd.name)
qd.SQL = "Select * from ALocalTable;"
qd.close
如果你想回到passthrough:
DoCmd.DeleteObject acQuery, qd.name
Set qd= MyDB.CreateQueryDef(qd.name)
qd.connect = GET_CONNECTION_STRING
qd.SQL = "Select * from SomeRemoteTable;"
qd.close
对于更新查询,设置“qd.ReturnsRecords=false”正确的方法是删除并创建QueryDef 在更改为本地表之前添加以下内容:
DoCmd.DeleteObject acQuery, qd.name
Set qd= MyDB.CreateQueryDef(qd.name)
qd.SQL = "Select * from ALocalTable;"
qd.close
如果你想回到passthrough:
DoCmd.DeleteObject acQuery, qd.name
Set qd= MyDB.CreateQueryDef(qd.name)
qd.connect = GET_CONNECTION_STRING
qd.SQL = "Select * from SomeRemoteTable;"
qd.close
对于按性质设置为“qd.ReturnsRecords=false”的更新查询,传递查询具有ODBC连接。这对于本地查询不是必需的,因为您可以简单地执行SQL。为什么不抓取SQL(比如:currentdb.querydfs(“passthru”).SQL)然后执行(但不使用之前的连接)?如果这两个查询有不同的SQL(如代码所示),我只保留这两个查询。并且只有开关
子窗体1.SourceObject
。就其性质而言,直通查询具有ODBC连接。这对于本地查询不是必需的,因为您可以简单地执行SQL。为什么不抓取SQL(比如:currentdb.querydfs(“passthru”).SQL)然后执行(但不使用之前的连接)?如果这两个查询有不同的SQL(如代码所示),我只保留这两个查询。并且只切换子表单1.SourceObject
。我将在下周才能确认它是否有效,但从逻辑上讲,我认为它会正常工作。我不认为只是删除查询定义并重新创建它。谢谢下周我才能确认这是否有效,但从逻辑上讲,我认为这会很好。我不认为只是删除查询定义并重新创建它。谢谢