获取传递查询的连接字符串

Posted

技术标签:

【中文标题】获取传递查询的连接字符串【英文标题】:Get Connection string for Pass through queries 【发布时间】:2012-10-24 16:26:43 【问题描述】:

我刚刚了解了MS-ACCESS中的直通查询。

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

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

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

这很好,因为我知道我将不得不很快更改连接,这样我就不必在很多地方编辑连接字符串。

谢谢。

【问题讨论】:

在大多数情况下,使用链接表更容易。您是否在连接字符串前加上 ODBC; 顺便说一句,我可以从连接表剪切并粘贴到传递的连接属性。 实际上,它适用于我的连接字符串。我只是想让它们使用我的链接表自动更新。 我认为您需要手动(在代码中)构建连接字符串,而不是从表中复制它,尤其是在您不使用可信连接的情况下。 访问connectionstrings.com 将帮助您找到要使用的正确字符串:) 【参考方案1】:

我不确定你在这里的意思:“对于查询访问会在执行 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 db 引擎,以便它可以执行评估。

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

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

【讨论】:

我的意思是mssqltips.com/sqlservertip/1482/… When querying a linked table, Access will return/load the entire table into Access before parsing the WHERE or HAVING clauses. Imagine the implications of querying a large table or data set comprised of multiple tables in Access against a linked SQL Server record source in your environment! 这就是为什么我认为它很糟糕。但我想我会坚持使用我的简单链接表,因为传递查询更难与参数一起使用,我不想在我的所有代码中处理连接字符串。 在您链接的那篇文章中,阅读 Craig Yellick 的评论(2011 年 7 月 22 日星期五 - 下午 2:23:33)。 谢谢你,这让我很开心 :) 如前所述,关于 Access 始终拉取所有行的建议是错误的。如果您有一个标准链接表(不通过)到 SQL Server,那么您可以使用简单的 where 子句(例如 invoice #)打开此标准 BOUND 表单,尽管该表单已绑定到具有 100 万行的 SQL Server 表,但访问将仅根据“where”子句从 SQL 服务器中拉出一行。

以上是关于获取传递查询的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

VS连接Access数据库--连接字符串及执行查询语句的方法(增删改查,用户名查重,根据用户获取密码查询)

在 SQL 查询中检索当前 SQL Server 连接字符串

用于访问直通查询的雪花的 ODBC 连接字符串

将连接字符串传递给代码优先的 DbContext

刷新每个查询所用的 Excel ODBC 数据连接查询时间

将连接字符串传递给dll?