Пожалуйста, помогите предотвратить рефакторинг уровня данных этого кода и транзакций ODP.NET.
Вопрос
Я использую клиент 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 в вашем сеансе.Побочным эффектом является то, что если вы не начали транзакцию, вы не сможете подтвердить неявную транзакцию.Я не знаю, есть ли доступ к неявной транзакции через объект подключения.