【问题标题】:Error when opening ADODB recordset using odbc dsn in MS Access在 MS Access 中使用 odbc dsn 打开 ADODB 记录集时出错
【发布时间】:2021-12-10 09:45:53
【问题描述】:

我有一个已使用至少 10 年的 MS Access 应用程序。最近,我将工作转移到安装了 Office 365 和 SQL Server Express 2019 的新开发机器上。机器操作系统为Windows 10 Pro。在我的旧机器上,我的应用程序运行得很好。有一个使用存储过程的查询,该过程从 SQL Server 后端的表中检索一条数据。我使用基于存储过程输出的 ADODB 记录集调用此过程。我所有的调用都使用基于 ODBC DNS 的连接字符串。将表重新链接到 SQL Server 后端时,此连接字符串在新机器上工作正常,但是当我在 ADODB 连接中使用它时,我收到错误“[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified ”。在旧的 Windows 7 开发机器上运行良好。它还可以在 Windows 10 和 Office 365 的客户端计算机上运行。引发错误的代码如下。错误发生在打开的连接线上。连接字符串为:ODBC;DSN=VROM;Trusted_Connection=Yes;APP=2019 Microsoft Office system;DATABASE=VROM1

Set con = New ADODB.Connection
            con.ConnectionString = DLookup("Link", "tblLinkData", "Use = True")
            con.Open
     Set rs = New ADODB.Recordset

我的问题“SQL Server 中是否有可能导致此错误的设置?”。据我所知,两个系统的设置相同,但两者之间显然存在一些不同。还有其他原因可以在一个系统上运行而不是在另一个系统上运行吗?

【问题讨论】:

  • ODBC 数据源管理器(32 位)和 ODBC 数据源管理器(64 位)中是否存在 VROM 数据源?
  • 是的,它存在于两个数据库中。我在我的开发机器上运行的是客户端系统的克隆。
  • 如果是网络相关问题,这可能会有所帮助Troubleshoot SQL Server Network Connectivity.

标签: sql-server ms-access dns connection-string adodb


【解决方案1】:

嗯,从哪里开始?

好的,首先,如果您使用 ODBC 面板创建 ODBC 连接,那么您实际上从未在该 DSN config = ODBC 中使用 ADO 连接!!!!

这意味着您一直在向 ADO 提供 ODBC 连接字符串。你可以这样做,但至少让我们知道发生了什么。

接下来: 您正在运行 SQL 浏览器服务吗?你现在必须这样做!不知道你是否安装了更高版本的 SQL SERVER,但在几个版本之前你会发现现在你必须运行浏览器服务。

这个:

原因当然是您可以(可能)运行多个 sql server 实例,并且现在必须指定默认实例 (SQLEXPRESS)。如前所述,较旧的实例没有此要求。为了“解决”多个实例,您现在必须运行 SQL 浏览器服务。如前所述,这不是过去的要求 - 现在是。该浏览器服务将 IP/服务器名称连接到实例,您现在在大多数情况下必须运行它。

也有例外,但你不想要太多的痛苦。

接下来:

在很长一段时间内,建议您使用无 DSN 连接的 Access 链接表。这样,在部署到所有工作站时,您无需在每个工作站上设置 DSN。

如果您使用 FILE dsn(不是系统或用户)链接 Access 表,则在表链接过程中,默认访问会将所有表链接转换为无 DSN。这意味着一旦链接,您甚至可以删除 DSN - 您不再需要它。

再次重申:仅当您创建 FILE dsn 并使用它来链接表时才适用。因此,这会处理无 DSN 的链接表。

请注意,如果您要修改 DSN,则必须链接,因为我刚刚告诉过您,默认情况下访问创建 + 使用 dsn-less 链接(假设您使用 FILE dsn 链接)。

现在,您当然可以为 ADO 使用相同的 dsn,但这意味着您正在为 ADO 提供 ODBC 驱动程序连接!!!

如果你想创建一个真正的 ADO 连接,那么你会/可以/应该说使用这个:

Dim strCon As String

strCon = "Provider=SQLOLEDB;;Initial Catalog=TEST4; " & _
         "Data Source =.\SQLEXPRESS;Trusted_Connection=yes"
         
Dim conn As New ADODB.Connection

conn.ConnectionString = strCon
conn.Open

Dim rst    As New ADODB.Recordset

rst.Open "SELECT * from tblHotels", conn
Do While rst.EOF = False
  Debug.Print rst!HotelName
  rst.MoveNext
Loop

现在我如何使用“。”对于本地主机。这可以替换为(本地),或者实际上计算机(服务器)名称是这样的:

strCon = "Provider=SQLOLEDB;;Initial Catalog=TEST4; " & _
         "Data Source =ALBERTKALLAL-PC\SQLEXPRESS;Trusted_Connection=yes"

接下来,确保您启用了 TC/IP 连接。

这里:

但是,由于您的情况一直以来您实际上一直在使用带有 ADO 的 ODBC 驱动程序,所以我不会动摇船。

但是,请按照上述检查您的设置。

既然是链接表,那么几乎其他一切都是DAO + odbc?

那么我可能不会将 ADO 引入该应用程序,只为使用 sql server 存储过程调用 +。

我一般会说使用这个;

with currentdb.tabledefs("qryPT")
    .sql = "exec MyProcName"
    .execute
end with

或者,如果是返回数据,那么我会使用这个:

dim rst        as DAO.RecordSet
with currentdb.tabledefs("qryPT")
    .sql = "exec MyProcName"
    set rst = .OpenRecordSet()
end with

所以,我很难找到使用 ADO 的理由。当然,既然你一直在使用 ADO,那么我想我会继续这样做。

但是,请检查浏览器设置。如果这些表是使用 FILE dsn 链接的,那么它们就是 dsn-less。

您可以尝试将现有链接表中的现有连接提供给 ADO 连接。

例如: strCon = CurrentDb.TableDefs("dbo_tblHotels").Connect strCon = Mid(strCon, 6)

Dim conn As New ADODB.Connection

conn.ConnectionString = strCon
conn.Open

跳过前 6 个字符会跳过这部分:

ODBC;DRIVER=SQL Server;SERVER=ALBERTKALLAL-PC\SQLEXPRESS;
UID=AlbertKallal;Trusted_Connection=Yes;APP=Microsoft Office 2010;
DATABASE=Test4;Network=DBMSLPCNM

所以我们再次提供 ADO ODBC 连接字符串。 (当然上面的连接字符串是一行)。

【讨论】:

  • 谢谢阿尔伯特。我确保 SQL 浏览器正在运行并且启用了各种通信协议。仍然出现连接错误。我接受了您的建议并使用 DAO 执行了存储过程,并且效果很好。
  • 那么一切都好。虽然我对使用 ADO 可能听起来有点苛刻——但我不是。只是如果您在其他地方没有真正使用它,那么删除整个 ADO 引用会带来一些相当大的好处(减少引用损坏的机会)。如前所述,如果您使用 FILE dsn 链接表,则 access 自动将这些转换为 dsn-less,然后 DSN 从该点被忽略,既不使用也不要求。
猜你喜欢
  • 1970-01-01
  • 2016-02-10
  • 2017-09-21
  • 2011-01-06
  • 1970-01-01
  • 2021-11-25
  • 2018-05-10
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多