ODBC调用失败 - 错误3151

问题描述:

我们将Access数据库从Access 97迁移到Acces 2007,并将一些链接表迁移到SQL Server 2008数据库。 我们在ODBC管理器中使用文件DSN。连接测试在那里工作正常。实际上,我们在Access 2007应用程序中有一个主窗体,可以始终正确显示数据。ODBC调用失败 - 错误3151

Dim dbs As Database
Dim rstAppend As Recordset
Set dbs = CurrentDb
Set rstAppend = dbs.OpenRecordset(strAccessTable, dbOpenDynaset, dbSeeChanges)

OpenRecordset引发错误号3151和随机发生的,但它似乎相当频繁:

的问题,当我们执行一个任务,让下面的调用出现。这是零星的。当我们没有得到错误时,任务运行良好。

  1. 它并不总是发生,大多数我们都很好。
  2. 当它发生时,会发生所有后续尝试的任务。我们必须关闭并重新打开Access数据库,并向善良的主祈祷它能够正常工作。
  3. 有时,刷新链接表管理器中的表可解决问题,但其他方法则不行。
  4. 刷新链接表管理器时,有时会收到错误“ODBC - 调用失败”。删除文件DSN并创建一个新的解决了这个问题。
  5. 我们尝试了两种不同的驱动程序(SQL Server和SQL Server Native Client 10),并且在这两种情况下问题依然存在。
  6. 此外,我们试图将访问文件放在与SQL Server相同的机器中,问题依然存在。
  7. 我们将所有查询的ODBC超时从60秒增加到180秒,但问题仍然存在。
  8. 我们不必等待才能看到错误,它会在执行任务后不到一秒钟内出现。

如果有人能够帮助我们找到解决此问题的方法,我们将非常高兴。

+0

下面给出了更多的错误细节吗? ACC2000:如何捕获特定的ODBC错误消息 可以使用Errors集合来捕获特定的开放式数据库连接(ODBC)错误。但是,您必须遍历集合中的所有元素才能访问ODBC错误信息。 http://support.microsoft.com/kb/209855 – 2010-09-25 19:06:05

+0

不只是引用了一个错误号 - 给出了错误描述,因为它只会查找通用错误描述(?AccessError(3151):“ODBC - 连接到'|'失败。”)。 – 2010-09-25 20:40:41

+0

错误描述是“ODBC - 连接到'DataseProduction1DSN'失败”。 DataseProduction1DSN是我们在ODBC管理器中使用的文件DSN的描述。 这里截图: http://img697.imageshack.us/img697/7804/errorpw.png – rodpedja 2010-09-29 15:21:22

经过两个月的研究,我们发现了一种解决方案,从DAO改为ADO。这是MS给我的答案:

我想让你知道,实施解决方法(使用ADO而不是DAO)可能比试图找出为什么DAO似乎不起作用要花费更多的时间。 因此,使用解决方法可能是明智的,而不是试图找出此问题的根本原因,尤其是因为它似乎不可重现。

但是;下面是我想要你做的下一个:

  1. 请用系统或用户DSN替换文件DSN。
  2. 对于SQL Server而不是本机驱动程序使用'正常'ODBC驱动程序。
  3. 创建用户DSN后,重新链接所有表。
  4. 在VBA代码中,只使用显式类型声明而不是隐式声明。所以请更换使用DAO。在任何数据库类型声明前面为了显式创建DAO对象。例如替换以下:

    昏暗DBS作为数据库
    昏暗rstAppend作为记录
    通过
    昏暗DBS作为DAO.DATABASE
    昏暗rstAppend作为DAO.Recordset

+1

是不是与文件DSN的问题?为什么不使用DSN连接? – 2010-12-03 21:25:30

有一点需要注意的是工作站网络配置中的DNS设置(DNS不是DSN!)。

几年前,我有一个客户端遇到零星的ODBC断开连接,像这样与一些用户,并且事实证明,主DNS设置为指向互联网提供商的DNS。这对于Internet来说工作正常,但ISP对客户端的SQL Server内部IP地址一无所知。将主DNS更改为指向本地域控制器(充当本地DNS)将永久解决此问题。

它可能不是你的问题的原因,但它值得一看。

从TCP开关/ IP到SQL Server ODBC驱动程序的客户端配置中的命名管道为我做了窍门。