这很有趣。我正在使用MS-Access 2007
做一个from,它将允许用户输入实验室结果中的数据。
发件人使用VBA
代码调用:
DAO.OpenRecordset("{Sql query}" , DB_OPEN_DYNASET, dbSeeChanges)
此调用通常可以正常工作,但是我注意到,当关闭此窗体然后重新打开时,会生成3151 ODBC
错误。
对于这种形式,我们正在通过Access 2007
使用链接表,我们的SQL-Server 2012
版本如下。
Microsoft SQL Server Management Studio 11.0.2100.60
Microsoft Analysis Services Client Tools 11.0.2100.60
Microsoft Data Access Components (MDAC) 6.1.7601.17514
Microsoft MSXML 3.0 6.0
Microsoft Internet Explorer 8.0.7601.17514
Microsoft .NET Framework 4.0.30319.237
Operating System 6.1.7601
DAO.OpenRecordset
调用在多个事件中使用。这是清单。
On_Current , _AfterUpdate , Form_Unload
我在Access 2007
上发现了一些类似错误的实例,这些实例具有与SQL-Server
的链接表,但是似乎没有一个可行的解决方案。
据我所知,3151
似乎没有以任何负面方式影响表单或数据。我能够打开表格,并且一切都在我所能告知的范围之内。该表上大约有2万条记录,因此我可能会丢失一些东西。
有人有什么想法吗?
9/14为了回应评论,我添加了一些附加代码。
这是Form_Unload上的调用。它包含失败的行。
Private Sub Form_Unload(Cancel As Integer)
Dim ImportID
Dim rst As DAO.Recordset
Dim db As Database
Set db = CurrentDb
Set ImportID = Me.ImportID
#This is the failing line below.
Set rst = db.OpenRecordset("SELECT [dbo_t_inspect].* FROM [dbo_t_inspect] WHERE [dbo_t_inspect].ImportID= " & ImportID & ";", DB_OPEN_DYNASET, dbSeeChanges)
这是来自On_Current的呼叫。实际上,此On_Current调用是由主窗体上的子窗体进行的。
Private Sub Form_Current()
Dim rst As DAO.Recordset
Dim strImportID As String
If IsNull(Me.ImportID) Then
[Forms]![Inspection Receiving]![LabComplete].Visible = False
[Forms]![Inspection Receiving]![LabPending].Visible = True
Else
strImportID = Me.ImportID
Dim db As Database
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT [dbo_t_health].*, [dbo_t_health].ImportID FROM [dbo_t_health] WHERE ((([dbo_t_health].ImportID)=" & Me.ImportID & "));", DB_OPEN_DYNASET, dbSeeChanges)
我不确定在此解决方案中DAO
的定义位置。我在名为Microsoft Office Access Class Objects
的文件夹中找不到该声明,我愿意就可能位于何处的问题提出建议。
确切的错误消息如下
无法连接到{ODBC连接名称}错误3151。
然后我可以选择debug选项,调试器将把我带到尝试连接我正在使用的ODBC连接的尝试失败的行。
该错误是高度可重复的。我要做的就是在安全警报上启用VBA
宏,然后打开有问题的表单。加载后我将表格关闭。一旦我尝试重新打开表单,就会收到上述错误。在错误上点击Ok
后,表单仍会打开。