【问题标题】:How to execute 3 Commands (SQL statements) to 3 different Oracle tables at one shot?如何一次对 3 个不同的 Oracle 表执行 3 个命令(SQL 语句)?
【发布时间】:2012-04-24 09:28:19
【问题描述】:

我正在使用带有 Oracle 10g 的 vb.net 2005 实现一个应用程序,我遇到了一个应该从 Oracle 中的三个不同表中选择/插入/更新/删除数据的功能。

所以我想知道有没有办法分别准备所有3条命令(SQL语句),然后一次性执行到oracle,所以这样我可以保证它们都成功执行或所有都未能执行,而且我可以获得更多的性能,这对我的情况至关重要。

因此,我正在 vb.net 中寻找一种语法,它可以帮助我一次向 oracle 执行多个 OracleCommand。

【问题讨论】:

  • 您需要签出交易

标签: vb.net oracle


【解决方案1】:

这可以用伪代码来回答

Dim cnn as OracleConnection
Dim tr as OracleTransaction 
Try
    cnn = new OracleConnection("your_connection_string")
    cnn.Open()
    tr = cnn.BeginTransaction(IsolationLevel.ReadCommitted)

    Dim cmd1 as OracleCommand = con.CreateCommand();
    Dim cmd2 as OracleCommand = con.CreateCommand();
    Dim cmd3 as OracleCommand = con.CreateCommand();

    cmd1.CommandText = "Your_Query_Text1"
    cmd2.CommandText = "Your_Query_Text2"
    cmd3.CommandText = "Your_Query_Text3"    

    cmd1.ExecuteNonQuery()
    cmd2.ExecuteNonQuery()
    cmd3.ExecuteNonQuery()

    tr.Commit()
    cnn.Close()
    cnn = Nothing
    tr = Nothing
Catch
   if tr <> Nothing then
       tr.Rollback()
   End if 
   If cnn <> Nothing Then 
       cnn.Close()
   End If
   cnn = Nothing
   tr = Nothing
End Try

事务使数据库作为一个单元执行一系列动作。您标记调用连接的 BeginTransaction 方法的事务的开始。保证事务块内的操作要么全部发生,要么全部不发生。

如果一切顺利,您确认交易并且所有内容都保存在您的表中。如果发生某些事情中断了您的代码流(异常),您应该调用“回滚”来取消您在事务中对数据库所做的所有操作。

【讨论】:

  • 谢谢史蒂夫...我只是想知道您的方式是否可以通过单独执行每个命令为我提供更好的性能...或者只是在出现错误时回滚执行...请告知。 ..
  • 另外我想告诉你删除 3 行 cmd1.ExecuteNonQuery() cmd2.ExecuteNonQuery() cmd3.ExecuteNonQuery() 因为 OracleCommand 的 Transaction 属性是 ReadOnly 并且不能被分配...
  • @Davideg 你的意思是我将事务分配给命令的三行吗?是的你是对的。如果您使用 ODP.NET,则无法设置该属性。微软的客户对此也有一些小问题。我会尝试编辑答案
  • @Davideg 在不知道查询文本的情况下无法就性能给出强有力的建议。然而,在类似的情况下,最好的改进可以通过查看一个在单个调用中执行所有相关命令的存储过程来实现。
  • 你能给我一个例子,说明如何使用存储过程在一次调用中执行我的所有命令...请记住,我正在使用我的命令插入/选择 BLOB 数据类型...
猜你喜欢
  • 2012-03-15
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多