Что делает ваш OpenConnection
метод?
Я предполагаю, что это открывает соединение с базой данных на совершенно независимом объекте OracleCommand. Я хотел бы предложить самое простое решение: передать объект OracleCommand в ByRef методу 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