【问题标题】:Having trouble connecting to SQL Server database from VBA using ADO connection使用 ADO 连接从 VBA 连接到 SQL Server 数据库时遇到问题
【发布时间】:2014-12-24 06:23:39
【问题描述】:

我想在不使用 DSN 的情况下连接到 SQL Server 数据库。尝试连接到所述数据库时收到错误消息。错误是

运行时错误“-2147467259 (80004005)”:[Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序

我的连接字符串如下所示:

"ODBC;DRIVER=SQL Server;SERVER=lokdb; UID=secret;PWD=secret;APP=Microsoft Open Database Connectivity;WSID=" & Environ$("COMPUTERNAME") & ";Network=DBMSSOCN;Trusted_Connection=Yes;DATABASE=EDMS-Lok"`

如果我从连接字符串中删除 DATABASE=EDMS-Lok 参数,我可以使用指定的凭据连接到服务器上的默认数据库,但是我似乎无法“找到”EDMS-Lok数据库。例如。如果我尝试使用

SELECT * FROM EDMS-Lok.dbo.eng_dwg

我收到一条错误消息

运行时错误“-2147217900 (80040e14)”:[Microsoft][ODBC SQL Server Driver][SQL Server]“-”附近的语法不正确

eng_dwg 是一个有效的表)

当我在未指定数据库的情况下进行连接时,ADO 连接对象的.DefaultDatabase 属性返回“020”,我什至看不到该服务器上的可用数据库?

连接后,如果我使用SELECT name FROM sys.databases,我可以获得可用数据库的列表。他们是:

  • 010
  • 100
  • 500
  • EDMS-乐
  • 大师
  • msdb
  • MSLLockDB
  • 酒吧
  • 临时数据库

我使用 DSN 让它工作,但我不想使用 DSN。

不知道这里有什么问题??

【问题讨论】:

  • 您是否尝试将数据库名称包含在 [ ] ... 中,例如 DATABASE=[EDMS-Lok]
  • 我刚刚做了,并取得了部分成功。我首先尝试将数据库名称包装在连接字符串中,即DATABASE=[EDMS-Lok],但这不起作用(同样的错误)。但是,如果我在不指定数据库的情况下进行连接,我可以使用SELECT * FROM [EDMS-Lok].dbo.eng_dwg 访问表因此,部分成功 - 知道为什么它在 select 语句中有效,但在连接字符串中无效吗?另外,我意识到我将TrustedConnection 参数设置为YES,并且我试图指定凭据,所以我将其更改为NO
  • 它在连接字符串中不起作用,因为该字符串不是 T-SQL 代码。要使其正常工作,您可能需要弄清楚如何转义破折号字符。
  • 山姆,这很有道理 - 谢谢!

标签: sql-server database vba database-connection connection-string


【解决方案1】:

我会说问题在于您混淆了身份验证模型。您提供用户 + 密码,但您还配置了受信任的连接 = 是。我不确定 ADO 在这种情况下是如何工作的,但我会假设它不使用配置的用户并连接到 windows 帐户。删除连接字符串中的可信连接参数,然后重试。

【讨论】:

  • 嗨 cboden,我对 Dee 的上述评论发表了评论 - 我在发布后不久就注意到了这一点,并更正了 TrustedConnection 参数。
【解决方案2】:

好的,这个答案应该归功于对原始问题发表评论的 Dee 和 Sam,但是我无法将评论标记为答案,所以这里是:

需要将数据库名称括在方括号 [ ] 中......像这样 DATABASE=[EDMS-Lok] -(归功于 DEE)

我首先尝试将数据库名称包装在连接字符串中,即 DATABASE=[EDMS-Lok] 但这不起作用(同样的错误)。但是,如果我在不指定数据库的情况下进行连接,我可以使用 SELECT * FROM [EDMS-Lok].dbo.eng_dwg 访问表

它在连接字符串中不起作用,因为该字符串不是 T-SQL 代码。要让它工作,您可能需要弄清楚如何转义破折号字符。 –(归功于 SAM)

我尝试了单引号和双引号、反斜杠、方括号、括号和大括号,但似乎没有任何方法可以在连接字符串中转义数据库名称中的连字符。但是,由于我现在可以访问我需要的数据库和表,这是最初的问题,我想将其标记为已回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多