Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 请帮助防止此ODP.NET代码和事务的数据层重构_Vb.net_Oracle_Odp.net - Fatal编程技术网

Vb.net 请帮助防止此ODP.NET代码和事务的数据层重构

Vb.net 请帮助防止此ODP.NET代码和事务的数据层重构,vb.net,oracle,odp.net,Vb.net,Oracle,Odp.net,我正在使用Oracle11g客户端和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 _beginT

我正在使用Oracle11g客户端和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为nothing/null?错误是:变量“txn”在赋值之前使用。运行时可能会导致空引用异常。链接或指向解决方案的指针也将不胜感激


编辑:感谢RichardOD指出,您不能明确声明不能通过ODP.NET在存储过程上打开事务。我已经证实这是一个问题。但我们仍然没有弄清楚为什么会发生错误。我知道txn最初在if语句中被赋予了一个w/值,但是在try/catch块之外定义会使它变得不相关。。。。正当或者这是错误的编码?

假设“beginTransaction”是布尔值,那么在“If”beginTransaction之前您是否将其设置为true

在启动此事务之前,您是否已提交上一个事务?Oracle可以在连接池和事务处理方面做一些奇怪的事情

很久以前,我有一个类似的错误

编辑-您正在尝试调用.NET存储过程吗?OracleConnection.BeginTransaction:

OracleConnection.BeginTransaction是 .NET存储过程不允许


问题:它在被忽略后立即无效吗?如果不是,它什么时候变为空?如果立即之后为null,则可能是连接池。如果在从康涅狄格州获得适配器后或在填充适配器后,那么它甚至更疯狂


但我会尝试发现,Oracle不需要事务来选择数据。你为什么试着打开一个

编辑: 如果您的vb代码是通过.net集成从oracle调用的,则正如RichardOD所写的,没有事务支持。请澄清环境

执行的sql语句是动态的,并在sSQL中给出。该命令已准备好并提供给填充数据集的DataAdapter。然后,您只能执行SELECT语句。否则就没有结果

因为参数也准备好了。您在调用存储过程时,没有告知命令类型为StoredProcedure。其中一个参数是ref cursor参数,它将被提取到数据集中。对吧?


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

在应用程序中,第二次调用此方法是第一次打开事务。using语句还应注意处理连接。对吗?如果连接是池连接,那么很可能就是问题开始的时候。未提交的旧连接上的新事务…对数据库的第一个调用是select,没有声明隐式事务。尝试在连接字符串中设置Pooling=false,然后发现仍然存在相同的问题。显然,不要保留此onPooling=false。没有更改任何内容。不,那是让我抓狂的部分。它确实有一个值,并且被分配了。所以只有当您提交时,它才会变为未分配?这肯定是事先发生的。不,我知道。添加了监视并再次逐步执行代码:在VS中,一步转到txn.Commit->命中f-10,用空的exception掉到Catch block中。好吧,在我们用GetOracleDecimal向一位客户提供了一年多的代码,与内存泄漏作斗争之后,我们开始不信任ODP.Net 2.0。。。祝你好运请稍候,如果错误为空引用,则可能会在运行时导致异常。这是一个编译错误,因为您的赋值是IF子句。问得好。从技术上讲,这是一个正在执行的程序。我正在重构数据层。@andrewWinn-如果您使用的是存储过程,我已经更新了我的答案来解释这不起作用。@andrewWinn:这个从plsql调用的vb代码是否集成到数据库中了?您正在隐式连接上运行吗?我有点困惑。