“System.ArgumentException:无效操作。连接已关闭”。我一直收到这个错误

时间:2011-05-19 13:32:30

标签: asp.net vb.net oracle10g

我在服务器上收到此错误。我不能在我的开发机器上复制它。

当我调用ExecuteReader,ExecuteScalar或尝试填充数据集时,我得到它。

我使用的是oracle数据库。

我认为,当服务器上的负载增加时,这会增加。我不确定。

我需要帮助解决这个问题。如果您需要更多详细信息,请与我们联系。

ExecuteScalar的代码如下

Public Function ExecuteScalar1(ByVal sExecuteString As String, ByVal sConnectString     As     String) As String
        Dim OrclCmd As New OracleCommand
        Try
            If OpenConnection(sConnectString) Then
                OrclCmd.CommandText = sExecuteString
                OrclCmd.CommandType = CommandType.Text
                OrclCmd.Connection = OrclConn
                ExecuteScalar_ = Convert.ToString(OrclCmd.ExecuteScalar())
                If ExecuteScalar_ Is System.DBNull.Value Then
                    ExecuteScalar_ = ""
                End If

            End If
        Catch ex As Exception
            Err.Raise(Err.Number, Err.Source, Err.Description)
        Finally
            Call CloseConnection()
        End Try
    End Function

1 个答案:

答案 0 :(得分:1)

您的OpenConnection方法做了什么?

我假设它在完全独立的OracleCommand对象上打开数据库连接。我建议这里最简单的解决方案是将ByRef中的OracleCommand对象传递给OpenConnection方法,允许您关联连接并在方法中打开它。

显然,这将要求您更改OpenConnection方法以同时接受ConnectionString参数以及OracleCommand对象,签名将是:

Public Sub OpenConnection(ByVal sConnectionString As String, ByRef orclCommand As OracleCommand)

这将允许您在两种方法中使用OracleCommand对象,它们都引用相同的对象 - 因此允许您在连接上调用.Open(),并在两种方法中打开连接。

重新阅读您的代码......

您似乎有一个名为OrclConn的对象,您指定给OrclCmd.Connection

我的通灵调试告诉我这是在此函数之外声明的静态对象。如果是这样,那就是你的问题 - 当多个用户访问此代码时,OrclConn对象可以在执行命令时让其他用户关闭它的连接。共享对象的典型竞争条件。

解决方案是使用函数本地的连接对象:

Public Function ExecuteScalar1(ByVal sExecuteString As String, ByVal sConnectString As String) As String
    Dim OrclCmd As New OracleCommand
    Dim OrclConn As New OracleConnection
    Try
        OrclConn.ConnectionString = sConnectString
        OrclConn.Open() 
        'Add any connection initialisation here

        OrclCmd.CommandText = sExecuteString
        OrclCmd.CommandType = CommandType.Text
        OrclCmd.Connection = OrclConn

        ExecuteScalar_ = Convert.ToString(OrclCmd.ExecuteScalar())

        If ExecuteScalar_ Is System.DBNull.Value Then
            ExecuteScalar_ = ""
        End If
    Catch ex As Exception
        Err.Raise(Err.Number, Err.Source, Err.Description)
    Finally
        If OrclConn.State <> ConnectionState.Closed Then ' Can't remember if this is correct
            OrclConn.Close()                             ' Just be sure to call this
        End If
    End Try
End Function