我在服务器上收到此错误。我不能在我的开发机器上复制它。
当我调用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
答案 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