说我有以下代码:
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进行多次写入,但是参数不同吗?
答案 0 :(得分:1)
当我做这种类型的事情时,我希望同一事务中的所有命令,我的循环实际上在owl:equivalentProperty
块内。
设置一次命令(即Timeout,CommandType,Connection等),然后循环将设置参数并重复执行。