ODBC 连接:“连接已被禁用”

Posted

技术标签:

【中文标题】ODBC 连接:“连接已被禁用”【英文标题】:ODBC connection: "The connection has been disabled" 【发布时间】:2015-01-06 16:02:26 【问题描述】:

我有一个名为 IPEOPLE 的 32 位 ODBC 连接器,我正在尝试使用 VB 进行连接。如果我打开 Access 并使用 ODBC 驱动器IPEOPLE,它可以正常工作,并且我可以看到同一用户下的数据。

在 VB 中,我遇到了这种错误:

System.Data.dll 中发生了“System.InvalidOperationException”类型的第一次机会异常 System.Transactions 严重:0:http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/UnhandledUnhandled exceptionNMIALERTS.vshost.exeSystem.InvalidOperationException,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089连接已被禁用。在 System.Data.Odbc.OdbcConnection.ConnectionIsAlive(异常 innerException) 在 System.Data.Odbc.OdbcConnection.HandleErrorNoThrow(OdbcHandle hrHandle, RetCode retcode)

低于该错误:

错误 [42000] [IPeople][Meditech ODBC 驱动程序 (5.0.0.36)][IPD 3.41] 选择中没有字段 --- 内部异常堆栈跟踪结束 ---

当我在 Access 中运行 SQL 时,它工作得很好。查询没问题。很明显选择了一个字段 (LIVE.NMISAA.QueueMessages.MessageID)。

我不太确定为什么。它没有被禁用。它可以通过 Access 很好地使用。 Windows ODBC 数据源管理器上没有“禁用”指示器。 “NMIALERTS2”是我机器上的用户 DSN。

代码:

    Dim myConnection As OdbcConnection = New OdbcConnection()
    myConnection.ConnectionString = "DSN=NMIALERTS2"

    Dim strQueryErxE1 As String = "SELECT LIVE.NMISAA.QueueMessages.MessageID FROM LIVE.NMISAA.QueueMessages " & _
        "WHERE LIVE.NMISAA.QueueMessages.QueueConnection = 'ERX_E_XO' and LIVE.NMISAA.QueueMessages.MessageID > '" & strPrevMsgID_ERX_E_XO & "'"

        Dim command1 As OdbcCommand
        Dim command2 As OdbcCommand

        If Active_ERX_E_XO = True Then
            command1 = New OdbcCommand(strQueryErxE1, connection) 'errors here
            command2 = New OdbcCommand(strQueryErxE2, connection)
        End If

有什么想法吗?

编辑:我已经从头开始重新构建代码,从 4000 行到最少 30 行仅测试 ODBC,并且发生了完全相同的问题。这是我的完整代码:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim myConnection As System.Data.Odbc.OdbcConnection = New System.Data.Odbc.OdbcConnection()
        myConnection.ConnectionString = "DSN=NMIALERTS2"

        Dim strQueryErxE1 As String = "SELECT LIVE.NMISAA.QueueMessages.MessageID FROM LIVE.NMISAA.QueueMessages " & _
    "WHERE LIVE.NMISAA.QueueMessages.QueueConnection = 'ERX_E_XO' and LIVE.NMISAA.QueueMessages.MessageID > '3000'"

        Dim command1 As System.Data.Odbc.OdbcCommand
        Dim strIIRADT1 As String = ""

        Using connection As New System.Data.Odbc.OdbcConnection(myConnection.ConnectionString)

            command1 = New System.Data.Odbc.OdbcCommand(strQueryErxE1, connection) 'error here

            connection.Open()

            Dim reader1 As System.Data.Odbc.OdbcDataReader

            reader1 = command1.ExecuteReader()

            If reader1.HasRows Then
                While reader1.Read
                    strIIRADT1 = reader1(0).ToString
                End While
            End If

        End Using

    End Sub
End Class

【问题讨论】:

您必须记录内部异常。首次机会异常通知不一定表示存在问题。 @HansPassant 我将它添加到我的问题中。这让我更加困惑,但查询很好(在 Access 中工作) @LarsTech 不。从字面上看,IPEOPLE 中的所有数据元素都是文本。我不问为什么... 【参考方案1】:

深挖136行错误后,发现这个被埋没了:

在目录“LIVE”中找不到数据库“xyz”,或者您的用户没有对该数据库的权限,或者该数据库未包含在 DSN 中

所以基本上我配置了 ODBC 错误。 VB没问题。这解决了更改此自定义驱动程序中的 ODBC 类型后的问题。

【讨论】:

您是如何“将 odbc 类型更改为自定义驱动程序”的?

以上是关于ODBC 连接:“连接已被禁用”的主要内容,如果未能解决你的问题,请参考以下文章

如何设置网站数据库,数据源odbc的连接

c#用odbc连接mysql报错

怎么用odbc连接mysql数据库

怎么用odbc连接mysql数据库

32位电脑ODBC连接

从代码更改/创建 ODBC 连接