Msgstr "System.ArgumentException: недопустимая операция. Соединение закрыто".Я продолжаю получать эту ошибку - PullRequest
0 голосов
/ 19 мая 2011

Я получаю эту ошибку на сервере.Я не могу воспроизвести это на моей машине для разработки.

Я получаю его, когда я вызываю 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 Ответ

1 голос
/ 19 мая 2011

Что делает ваш 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...