代码之家  ›  专栏  ›  技术社区  ›  Shekhar

如何执行两个command.ExecuteNonQuery命令()使用单一连接的方法?

  •  1
  • Shekhar  · 技术社区  · 15 年前

    我试图调用OracleCommand类的两个不同对象的ExecuteNonQuery()方法。这两个对象使用相同的连接对象,但具有不同的commandText和参数。我正在使用ODP.net、C#(.net 2.0 framework)和Oracle 10g。

    代码段如下:

    // OpenDatabaseConnection() methods checks and opens database connection
    bool connectionOpened = OpenDatabaseConnection();
    if (connectionOpened)
    {
        command.ExecuteNonQuery();
        commitCommand.ExecuteNonQuery();
    }
    

    我的问题是 command.ExecuteNonQuery(); 当控件尝试执行第二条语句时,执行,连接关闭,我得到“连接必须打开才能执行此操作”的异常。为什么执行ExecuteNonQuery()方法后连接会自动关闭?

    有人能告诉我怎么处理这种情况吗? 在第二个命令对象中,我只是尝试提交更改,其他什么都没有。如何在不使用事务的情况下提交更改?

    提前谢谢

    **

    编辑

    只是想知道,打开和关闭连接的最佳实践是什么?我们是在每个ExecuteNonQuery()、ExecuteScalar()等方法上打开连接并关闭连接(只要完成),还是在应用程序启动时打开连接并保持连接打开直到应用程序结束?请开导!!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ian Johnson    15 年前

    你的commit命令是什么?那只是为了工作吗?如果是这样的话,您就不需要这样做了,因为无论您是否喜欢,事务都将在运行第一个查询时隐式地创建和提交。

    如果两个查询都需要作为一个整体运行和提交,那么听起来您可能想使用事务

    using(var connection = new OracleConnection(connectionString))
    {
        var firstCommand = new OracleCommand(firstCommandString);
        var secondCommand = new OracleCommand(secondCommandString);
    
        var transaction = connection.BeginTransaction("SampleTransaction");
    
        firstCommand.Connection = connection;
        firstCommand.Transaction = transaction;
    
        secondCommand.Connection = connection;
        secondCommand.Transaction = transaction;
    
        firstCommand.ExecuteNonQuery();
        secondCommand.ExecuteNonQuery();
    
        transaction.Commit();
    }
    
        2
  •  4
  •   Winston Smith    15 年前

    如何提交更改而不使用

    这没有任何意义。如果没有显式使用事务,则会自动提交更改。