获取传递查询的连接字符串
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数据库--连接字符串及执行查询语句的方法(增删改查,用户名查重,根据用户获取密码查询)