Пожалуйста, помогите предотвратить рефакторинг уровня данных этого кода и транзакций ODP.NET.

StackOverflow https://stackoverflow.com/questions/1340418

  •  20-09-2019
  •  | 
  •  

Вопрос

Я использую клиент Oracle 11g с ODP.NET.Я пытаюсь добавить условную обработку транзакций.

Dim ds As New DataSet()
Dim txn As OracleTransaction
Dim _beginTransaction as Bolean = true
 Using conn As New OracleConnection(ConnString)
            Try
                conn.Open()
                If _beginTransaction Then
                        txn = conn.BeginTransaction(IsolationLevel.Serializable)
                End If

                Dim adapter As OracleDataAdapter = New OracleDataAdapter()
                adapter.SelectCommand = New OracleCommand(sSQL, conn)

                For i As Integer = 0 To UBound(parameters, 1)
                    adapter.SelectCommand.Parameters.Add(parameters(i))
                Next

                adapter.Fill(ds)
                If _beginTransaction Then
                    txn.Commit() //txn is undefined here? why?
                End If


            Catch e As Exception
                txn.Rollback()
            End Try
        End Using

Как исправить, что txn равен нулю/нолю?Ошибка:Переменная «txn» используется до того, как ей было присвоено значение.Исключение нулевой ссылки может возникнуть во время выполнения.Также будем признательны за ссылки или указатели на решения.

Редактировать: Спасибо RichardOD за указание на то, что нельзя явно заявить, что транзакция не может быть открыта в хранимых процедурах через ODP.NET.Я подтвердил, что это проблема.НО Мы до сих пор не выяснили, почему возникает ошибка.Я понимаю, что txn изначально присваивается значение в операторе if, но определение вне блока try/catch должно сделать это неактуальным....верно?Или это плохая кодировка?

Это было полезно?

Решение

Предполагая, что _beginTransaction - это логическое If _beginTransaction Then ?

Также вы совершили предыдущую транзакцию, прежде чем начать эту работу? Oracle может делать странные вещи с объединением соединений и транзакцией.

Давным -давно у меня была ошибка, похожая на это. Вы смотрели здесь?

Редактировать- Вы пытаетесь вызвать .NET, хранящийся Proc? OracleConnection.BeginTransaction не поддерживает вызовы хранимых процедур:

OracleConnection.BeginTransaction не допускается для хранимой процедуры .NET

Другие советы

ВОПРОС: Это ноль сразу после подряд? А если нет, то когда это становится нулевым? Если он нулевой после немедленного, это может быть обмен соединением. Если после получения адаптера из Конна или после его заполнения, то это даже безумнее ...

Но я бы попытался выяснить

Oracle не требует транзакции для выбора данных.Почему вы пытаетесь открыть его?

РЕДАКТИРОВАТЬ:
Если ваш код vb вызывается из oracle (через интеграцию .net), то поддержка транзакций отсутствует, как писал RichardOD.Пожалуйста, уточните окружающую среду.

Выполняемый оператор sql является динамическим и приведен в sSQL.Команда подготавливается и передается DataAdapter, который заполняет DataSet.Тогда вы можете выполнять только инструкции SELECT.Иначе нет результата.

ИЛИ

Потому что параметры тоже подготовлены.Вы вызываете хранимую процедуру (не сообщая, что CommandType — StoredProcedure).Одним из ваших параметров является параметр курсора ссылки, который будет загружен в DataSet.Верно?

Oracle не требует явных транзакций, как это делает сервер sql.Oracle начинает неявную транзакцию с первого оператора dml в вашем сеансе.Побочным эффектом является то, что если вы не начали транзакцию, вы не сможете подтвердить неявную транзакцию.Я не знаю, есть ли доступ к неявной транзакции через объект подключения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top