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

Multiple database commands in one OracleConnection

假设我有以下代码:

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...(例如,我将一个对象列表放入数据库)但代码相同,那么最好在哪里执行此操作?我是将循环放在 "Using conn..." 内部还是外部?

例如:

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

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

The Promote method returned an invalid value for the distributed transaction.

---编辑---

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

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

当我做这种事情时,我希望所有命令都在同一个事务中,我的循环实际上会在 Using oCommand 块内。

设置您的命令一次(即超时、命令类型、连接等),然后您的循环将设置参数并重复执行。