我们将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并随机出现,但它经常出现。这是零星的。当我们没有得到错误时,任务正常。
如果有人能帮我们找到解决这个问题的方法,我们将非常高兴。
答案 0 :(得分:1)
经过两个月的研究,我们找到了一个解决方案,从DAO改为ADO。这是MS给我的答案:
我想让您意识到,实现变通方法(使用ADO而不是DAO)可能比尝试找出DAO似乎不起作用的时间更少。 因此,建议使用变通方法而不是尝试找出此问题的根本原因,尤其是因为它似乎不可重现。
然而;这是我下次要做的事情:
在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之后,它就可以工作了。