MSOLEDBSQL引起错误3706:找不到提供程序

4
一位客户多年来一直使用 Excel VBA 应用程序与 SQL 数据库进行交互。最近,数据库已从 TLS 1.0 升级到 TLS 1.2,这导致 VBA 到数据库的连接失败,因为 SQLOLEDB 驱动程序已被弃用。(背景可以在 这里这里 找到。)
为了解决这个问题,我正在尝试将 SQL 驱动程序从 SQLOLEDB 更改为 MSOLEDBSQL。然而,尝试连接到数据库会触发运行时错误 3706:“提供程序无法找到。可能未正确安装。”
以下是相关代码:
Dim conn As ADODB.Connection
Dim sConnString As String
 
sConnString = "Provider=MSOLEDBSQL;" & _
  "Data Source=MyServerName;" & _
  "Initial Catalog=MyDBName;" & _
  "User ID=SomeID;" & _
  "Password=SomePassword;" & _
  "DataTypeCompatibility=80"

Set conn = New ADODB.Connection
conn.Open sConnString

所有我在网上找到的指示都说只需安装来自微软的MSOLEDBSQL驱动程序,然后在代码中将 Provider=SQLOLEDB 更改为 Provider=MSOLEDBSQL。但是由于我一直收到错误3706的提示,我可能漏掉了某个步骤。
到目前为止所采取的步骤:
  1. 从 Microsoft 安装了 32 位的 MSOLEDBSQL 驱动程序
  2. 确认 DLL 文件已添加到默认位置 C:\Windows\System32。
  3. 重启 Windows。
  4. 从命令行运行 REGSVR32 "C:\Windows\System32\msoledbsql19.dll"。Windows 确认资源已正确注册。
  5. 在 Visual Basic 编辑器中,添加对 Microsoft ActiveX 数据对象 6.1 库 的引用(并删除对旧版本 2.8 库的引用)。

当 Windows 确认已正确注册时,驱动程序是否未被正确安装,如错误描述所述,这是可以想象的吗?我该如何解决这个问题?对此有什么想法?

2个回答

6
通过数据库管理员的宝贵帮助,我们能够找出并解决了这个错误。结果证明问题非常简单。
最新的 MSOLEDBSQL 驱动程序版本 19 引入了几项重大更改,其中之一是默认打开加密功能。微软承认这是一项“向后不兼容”的变化。他们在这里讨论了这些变化及其原因。
这个修改过的连接字符串版本可用:
Dim conn As ADODB.Connection
Dim sConnString As String
 
sConnString = "Provider=MSOLEDBSQL19;" & _
   "Data Source=MyServerName;" & _
   "Initial Catalog=MyDBName;" & _
   "User ID=SomeID;" & _
   "Password=SomePassword;" & _
   "Use Encryption for Data=False;" & _
   "DataTypeCompatibility=80"

Set conn = New ADODB.Connection
conn.Open sConnString

唯一的重大变化是需要指定“Use Encryption for Data=False”。

这个解决方案对我也有效。但是,当我使用Provider=MSOLDDBSQL而没有19时,我会得到原始错误。我不想在字符串中硬编码版本号,所以有没有一种方法可以在提供程序部分结尾不加19的情况下使其正常工作? - paulmorriss
1
这是一个好问题;你应该发一个新帖子,看看是否有人有真正的答案。我的第一反应是,如果MSOLEDBSQL19和MSOLEDBSQL调用相同版本的驱动程序,那么你期望字符串可以两种方式都能工作。错误提示表明,在未指定19时激活了某个其他版本。我建议尝试从目标系统中排除任何旧版本,看看是否可以解决问题。 - BDra
事实上,我在发布说明页面上找到了旧版本18.5,并安装了它,而且没有修改连接字符串就可以正常运行。 - paulmorriss

1

我们曾经遇到过一个类似的问题,我们的一款旧的ASP Web应用在迁移到Azure托管实例后无法访问SQL Server。我的回答可能看起来与此无关,但它可能确实能帮助你。

我们发现Web服务器无法连接到SQL服务器,因为它需要处理TLS 1.2(但在我们设置DSN并在那里运行测试之前,我们遇到了通用错误。Windows中的ODBC数据源应用程序)

我们不得不切换到ODBC 13.1(也有v18可用)。 这是13.1的链接 https://www.microsoft.com/en-us/download/details.aspx?id=53339 它能够处理TLS 1.2

我们必须安装ODBC 18才能使我们的内部.NET 4.8应用程序与Azure配合使用。 https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16

当我们尝试使用OLEDB 19连接Azure托管实例时,我们的应用程序遇到了许多晦涩的问题。有时它运行得很好,而有时它会彻底失败。因此,我建议使用ODBC 13.1(或更高版本)。

另一个有帮助的事情是在出现问题的机器上设置一个测试DSN(Windows中的ODBC数据源应用程序)。一旦我们设置了一个测试DSN,我们就发现了TLS错误,而之前只是我们的应用程序显示基本的无法连接错误。


谢谢您的建议。我会尝试去追踪这些线索,并在此处发布回复,如果有任何进展。 - BDra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接