ODBC调用失败 - 错误3151

时间:2010-09-24 13:21:35

标签: sql-server ms-access odbc

我们将Access数据库从Access 97迁移到Acces 2007,并将一些链接表迁移到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并随机出现,但它经常出现。这是零星的。当我们没有得到错误时,任务正常。

  1. 总是不会发生,大多数情况下我们没事。
  2. 当它发生时,它会发生在所有后续尝试的任务中。我们必须关闭并重新打开Access数据库,并向好主祈祷它有效。
  3. 有时,刷新链接表管理器中的表可以解决问题,但其他人则不能解决问题。
  4. 刷新链接表管理器时,有时会收到错误“ODBC - Call Failed”。删除文件DSN并创建新文件可以解决问题。
  5. 我们尝试了两种不同的驱动程序(SQL Server和SQL Server Native Client 10),但在这两种情况下问题仍然存在。
  6. 此外,我们尝试将访问文件放在与SQL Server相同的计算机上,问题仍然存在。
  7. 我们已将所有查询的ODBC超时从60秒增加到180秒,但问题仍然存在。
  8. 我们不必等待看到错误,在执行任务后不到一秒就会出现。
  9. 如果有人能帮我们找到解决这个问题的方法,我们将非常高兴。

4 个答案:

答案 0 :(得分:1)

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

我想让您意识到,实现变通方法(使用ADO而不是DAO)可能比尝试找出DAO似乎不起作用的时间更少。 因此,建议使用变通方法而不是尝试找出此问题的根本原因,尤其是因为它似乎不可重现。

然而;这是我下次要做的事情:

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

    Dim dbs作为数据库
    Dim rstAppend As Recordset
    通过
    Dim dbs作为DAO.Database
    Dim rstAppend As DAO.Recordset

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

几年前我有一个客户端遇到了与某些用户类似的偶发ODBC断开连接,结果证明主DNS设置为指向Internet提供商的DNS。这适用于Internet,但ISP对客户端的SQL Server内部IP地址一无所知。将主DNS更改为指向本地域控制器(充当本地DNS)可永久解决该问题。

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

答案 3 :(得分:0)

我也遇到了这个问题。我所做的是在“用户”选项卡中将DSN添加到SQL数据库。我注意到它正在我的开发系统上运行,这是我能找到的唯一区别。在用户PC上创建DSN之后,它就可以工作了。