ODBC 调用失败 - 错误 3151
Posted
技术标签:
【中文标题】ODBC 调用失败 - 错误 3151【英文标题】:ODBC Call Failed - Error 3151 【发布时间】:2010-09-24 13:21:34 【问题描述】:我们有一个从 Access 97 迁移到 Acces 2007 的 Access 数据库,其中包含一些链接到 SQL Server 2008 数据库的表。 我们在 ODBC 管理器中使用文件 DSN。连接测试在那里工作正常。事实上,我们在 Access 2007 应用程序中有一个主窗体,它始终正确地显示数据。
当我们执行进行以下调用的任务时出现问题:
Dim dbs As Database
Dim rstAppend As Recordset
Set dbs = CurrentDb
Set rstAppend = dbs.OpenRecordset(strAccessTable, dbOpenDynaset, dbSeeChanges)
OpenRecordset 抛出错误号 3151 并随机出现,但出现频率很高。它是零星的。当我们没有收到错误时,该任务可以正常工作。
-
这并不总是发生,大多数情况下我们都很好。
当它发生时,它会发生在所有后续尝试的任务中。我们必须关闭并重新打开 Access 数据库,并向上帝祈祷它可以正常工作。
有时,刷新链接表管理器中的表可以解决问题,但其他情况则不能。
刷新链接表管理器时,我们有时会收到错误“ODBC--调用失败”。删除文件 DSN 并创建一个新的 DSN 即可解决问题。
我们已尝试使用两种不同的驱动程序(SQL Server 和 SQL Server Native Client 10),但在这两种情况下问题仍然存在。
我们还尝试将访问文件与 SQL Server 放在同一台机器上,但问题仍然存在。
我们已将所有查询的 ODBC 超时时间从 60 秒增加到 180 秒,但问题仍然存在。
我们不必等待看到错误,它会在执行任务后不到一秒的时间内出现。
如果有人可以帮助我们找到解决此问题的方法,我们将非常高兴。
【问题讨论】:
以下是否为您提供了更多错误详细信息? ACC2000:如何捕获特定的 ODBC 错误消息 您可以使用错误集合来捕获特定的开放式数据库连接 (ODBC) 错误。但是,您必须遍历集合中的所有元素才能访问 ODBC 错误信息。 support.microsoft.com/kb/209855 不要只引用错误编号 - 给出错误描述,因为其中包含您无法通过查找通用错误描述获得的信息 (?AccessError(3151) : "ODBC--连接到 '|' 失败。"). 错误描述是“ODBC--连接到'DataseProduction1DSN'失败”。 DataseProduction1DSN 是我们在 ODBC 管理器中使用的文件 DSN 的描述。截图如下:img697.imageshack.us/img697/7804/errorpw.png 【参考方案1】:经过两个月的研究,我们找到了一种解决方案,从 DAO 改为 ADO。这是MS给我的答案:
我想让您知道,与尝试找出 DAO 似乎不起作用的原因相比,实施解决方法(使用 ADO 代替 DAO)可能会花费更少的时间。 因此,建议使用解决方法而不是试图找到此问题的根本原因,尤其是因为它似乎不可重现。
但是;下面是我希望你接下来做的事情:
-
请用系统或用户 DSN 替换文件 DSN。
对 SQL-Server 使用“普通”ODBC 驱动程序,而不是本机驱动程序。
创建用户 DSN 后重新链接所有表。
在 VBA 代码中,仅使用显式类型声明而不是隐式声明。所以请更换使用DAO。在任何数据库类型声明之前,以便显式创建 DAO 对象。例如替换以下内容:
将 dbs 调暗为数据库 暗淡 rstAppend 作为记录集 由 将 dbs 调暗为 DAO.Database Dim rstAppend As DAO.Recordset
【讨论】:
不是文件DSN的问题吗?为什么不使用无 DSN 连接?【参考方案2】:在 SQL Server ODBC 驱动程序的客户端配置中从 TCP/IP 切换到命名管道对我有用。
【讨论】:
【参考方案3】:需要注意的是工作站网络配置中的 DNS 设置(DNS 不是 DSN!)。
几年前,我的一个客户遇到了与某些用户类似的零星 ODBC 断开连接,结果发现主 DNS 设置为指向 Internet 提供商的 DNS。这在 Internet 上运行良好,但 ISP 对客户端的 SQL Server 的内部 IP 地址一无所知。将主 DNS 更改为指向本地域控制器(充当本地 DNS)永久解决了该问题。
这可能不是您的问题的原因,但值得一看。
【讨论】:
【参考方案4】:我也遇到了这个问题。我所做的是在“用户”选项卡中将 DSN 添加到 SQL 数据库中。我注意到它在我的开发系统上运行,这是我能找到的唯一区别。在用户 PC 上创建 DSN 后,它可以工作。
【讨论】:
以上是关于ODBC 调用失败 - 错误 3151的主要内容,如果未能解决你的问题,请参考以下文章
ODBC 调用失败 - 从 32 位 ODBC 5.1 移动到 64 位 5.3 后出现随机日期溢出错误
使用ms-access确定ODBC失败的真正原因(错误3146)?