获取Pass through查询的连接字符串

时间:2012-10-24 16:26:44

标签: sql-server ms-access ms-access-2010

我刚刚了解了MS-ACCESS中的传递查询。

我有SQL SERVER后端和 如果我是对的,对于查询访问,在执行where子句之前加载所有记录...那么有一个SQL SERVER后端是什么意思?

这就是为什么我想尝试尽可能多地使用传递查询但是有没有办法从链接表中获取连接字符串以便我通过查询?

我在CurrentDb.TableDefs("One of my table name").Connect属性中尝试了ODBC Connect Str,但我收到错误,说它是无效的连接字符串。

这很好,因为我知道我必须尽快更改连接,所以我不必在很多地方编辑连接字符串。

谢谢。

1 个答案:

答案 0 :(得分:2)

我不确定你的意思:“对于查询访问,在执行where子句之前加载所有记录

如果可以在服务器上应用WHERE子句,ODBC将把它转换为服务器的语言,只有匹配的行将被发送回Access:

WHERE date_field >= #2011-01-01# AND date_field < #2012-01-01#

WHERE子句会将发送给Access的行仅限制为date_field值来自2011年的行。

但是,如果WHERE子句包含必须由Access评估的函数,则ODBC必须检索所有候选行并将其移交给Access数据库引擎,以便它可以执行评估。

WHERE Format(date_field, 'yyyy') = '2011'

但是对于您的实际问题...传递查询的连接字符串...请考虑以下代码示例。我有一个名为dbo_foo的ODBC链接,其SQL Server中的源表为[dbo].[foo]。所以我可以从.Connect获取dbo_foo属性,并将其用于基于同一服务器表的传递查询的.Connect属性。

Public Sub CreatePassThruQuery()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim strConnect As String
    Set db = CurrentDb
    strConnect = db.TableDefs("dbo_foo").Connect
    Set qdf = db.CreateQueryDef("qryDbo_Foo")
    qdf.Connect = strConnect
    qdf.SQL = "SELECT * FROM [dbo].[foo];"
    qdf.Close
    Set qdf = Nothing
    Set db = Nothing
End Sub

当您更改表的.Connect属性时,您还需要为查询执行此操作。如果您有许多和/或经常更改连接,那么创建VBA过程来更新它们可能是值得的。或者,您可以将DSN用于表的.Connect属性并匹配查询。然后根据需要修改DSN。这种方法的一个缺陷是,如果其他人将使用您的应用程序,您将需要在多台计算机上管理DSN。