0

我正在使用带有 ODP.NET 的 Oracle 11g 客户端。我正在尝试添加条件事务处理。

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 块之外定义应该使这无关紧要......对吗?还是编码不好?

4

3 回答 3

0

假设 _beginTransaction 是一个布尔值,您之前是否将其设置为 true If _beginTransaction Then

在开始此之前,您还提交了上一个交易吗?Oracle 可以通过连接池和BeingTransaction 做一些奇怪的事情。

很久以前,我有一个类似的错误。你看过这里吗?

编辑- 您是否尝试调用 .NET 存储过程?OracleConnection.BeginTransaction 不支持存储过程调用

.NET 存储过程不允许使用 OracleConnection.BeginTransaction

于 2009-08-27T11:21:50.433 回答
0

问题:被赋值后是否立即为空?如果不是,它什么时候变为空?如果它立即为空,则可能是连接池的东西。如果在从 conn 获得适配器或填充它之后,那就更疯狂了......

但我会尝试找出

于 2009-08-27T12:16:37.900 回答
0

Oracle 不需要事务来选择数据。你为什么要尝试打开一个?

编辑:
如果您的 vb 代码是从 oracle 调用的(通过 .net 集成),那么就像 RichardOD 所写的那样,没有事务支持。请说明环境。

执行的 sql 语句是动态的,并在sSQL中给出。该命令已准备好并提供给填充 DataSet 的 DataAdapter。比你只能执行 SELECT 语句。否则没有结果。

或者

因为参数也准备好了。您正在调用存储过程(没有告诉 CommandType 是 StoredProcedure)。您的参数之一是将提取到数据集中的引用游标参数。对?

Oracle 不像 sql server 那样需要显式事务。Oracle 使用会话中的第一个 dml 语句启动一个隐式事务。副作用是,如果您没有启动事务,则无法提交隐式事务。我不知道是否可以通过连接对象访问隐式事务。

于 2009-08-27T13:32:23.413 回答