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)?

ODBC——调用失败

访问 ODBC 问题:ODBC--调用失败

Access ODBC passthru 查询失败,错误 3146 给出不同的错误描述文本

为啥在 Access 中使用 UNION ALL 时出现 ODBC 连接失败错误?