Sql server ODBC调用失败-错误3151

Sql server ODBC调用失败-错误3151,sql-server,ms-access,odbc,Sql Server,Ms Access,Odbc,我们将Access数据库从Access 97迁移到Acces 2007,并将一些链接表迁移到SQL Server 2008数据库。 我们正在ODBC管理员中使用文件DSN。连接测试在那里运行良好。事实上,Access 2007应用程序中有一个主窗体,它始终正确显示数据 当执行进行以下调用的任务时,会出现问题: Dim dbs作为数据库 Dim rstAppend为记录集 设置dbs=CurrentDb Set rstAppend=dbs.OpenRecordset(strAccessTable、

我们将Access数据库从Access 97迁移到Acces 2007,并将一些链接表迁移到SQL Server 2008数据库。 我们正在ODBC管理员中使用文件DSN。连接测试在那里运行良好。事实上,Access 2007应用程序中有一个主窗体,它始终正确显示数据

当执行进行以下调用的任务时,会出现问题:

Dim dbs作为数据库
Dim rstAppend为记录集
设置dbs=CurrentDb
Set rstAppend=dbs.OpenRecordset(strAccessTable、dbOpenDynaset、dbSeeChanges)

OpenRecordset抛出错误号3151并随机出现,但出现频率相当高。这是零星的。当我们没有得到错误时,任务工作正常

  • 这并不总是发生,大部分情况下我们都很好
  • 当它发生时,所有后续尝试的任务都会发生这种情况。我们必须关闭并重新打开Access数据库,并向上帝祈祷它能正常工作
  • 有时,在链接表管理器中刷新表可以解决问题,但其他的则不能
  • 刷新链接表管理器时,我们有时会收到错误“ODBC--Call Failed”。删除文件DSN并创建一个新文件可以解决此问题
  • 我们尝试了两种不同的驱动程序(SQL Server和SQL Server本机客户端10),但在这两种情况下问题仍然存在
  • 此外,我们还尝试将Access文件放在与SQL Server相同的机器上,但问题仍然存在
  • 我们已经将所有查询的ODBC超时时间从60秒增加到180秒,但问题仍然存在
  • 我们不必等待看到错误,它会在执行任务后不到一秒钟内出现

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

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

    几年前,我有一个客户机,他遇到一些用户的ODBC断线,结果发现主DNS设置为指向Internet提供商的DNS。这在互联网上运行良好,但ISP对客户端的SQL Server内部IP地址一无所知。将主DNS更改为指向本地域控制器(充当本地DNS)永久解决了该问题


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

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

    我想让您知道,实现变通方法(使用ADO而不是DAO)比试图找出DAO似乎不起作用的原因花费的时间要少。 因此,建议使用变通方法,而不是试图找到此问题的根本原因,尤其是因为它似乎不可复制

    但是,;下面是我希望你接下来做的事情:

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

    Dim dbs作为数据库
    Dim rstAppend为记录集
    通过
    Dim dbs作为DAO.Database
    Dim rstAppend为DAO.Recordset


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

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

    以下内容是否提供了更多错误详细信息?ACC2000:如何捕获特定的ODBC错误消息您可以使用Errors集合捕获特定的开放数据库连接(ODBC)错误。但是,必须遍历集合中的所有元素才能访问ODBC错误信息。不要只引用错误号——请给出错误描述,因为其中包含的信息仅通过查找一般错误描述(“AccessError(3151):“ODBC--连接到“|”失败。”)是无法获得的。错误描述是“ODBC--连接到“DataseProduction1DSN”失败”。DataseProduction1DSN是我们在ODBC管理员中使用的文件DSN的描述。这里是屏幕截图:文件DSN不是有问题吗?为什么不使用无DSN连接?