一个OracleConnection中的多个数据库命令

时间:2015-11-12 09:18:10

标签: vb.net oracle odp.net transactionscope

说我有以下代码:

Dim sqlText as String = "MERGE INTO..."

 Using scope As New TransactionScope()
    Using conn As New OracleConnection(connString)
        conn.Open()
        Using oCommand As New OracleCommand(sqlText)
            oCommand.BindByName = True
            oCommand.Parameters.Add("param1",OracleDbType.Raw,value1,ParameterDirection.Input)
            oCommand.Parameters.Add("param2",OracleDbType.IntervalDS,value2,ParameterDirection.Input)
            // etc.
            oCommand.Connection = conn
            oCommand.Prepare()
            oCommand.CommandType = CommandType.Text
            oCommand.ExecuteNonQuery()
        End Using
    End Using
End Using

如果我想用不同的参数做多个MERGE INTO ...(例如我将一个对象列表放入数据库)但是相同的代码,哪里是最好的地方呢?我是否将循环置于“使用conn ...”或外部?

e.g:

Dim items as List(Of ItemsToPutIntoDatabase) = ...
Using scope as New TransactionScope()
    For Each item
        Using conn...

Dim items as List(Of ItemsToPutIntoDatabase) = ...
Using scope as New TransactionScope()
    Using conn...
        For Each item

当我把它放在外面(第二个)时,我收到一个错误:

  

Promote方法为分布式返回了无效值   事务。

--- ---编辑

好的,所以我找到了using TransactionScope : System.Transactions.TransactionAbortedException: The transaction has aborted,它回答了有关错误的部分(一个TransactionScope内部的多个连接导致问题) - 所以我必须将每个命令作为一个单独的事务处理?或者,只连接一次并完成其中的所有操作。

有人可以帮助我理解如何使用相同的OracleConnection对象和SQL进行多次写入,但是参数不同吗?

1 个答案:

答案 0 :(得分:1)

当我做这种类型的事情时,我希望同一事务中的所有命令,我的循环实际上在owl:equivalentProperty块内。

设置一次命令(即Timeout,CommandType,Connection等),然后循环将设置参数并重复执行。