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

时间:2010-09-08 11:46:10

标签: c# database oracle oracle10g odp.net

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

代码段如下:

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

在执行上述两个语句之前,我正在检查连接是否打开。如果它未打开,那么我打开连接。 我的问题是,在command.ExecuteNonQuery();执行后,连接被关闭,当控制尝试执行第二个语句时,我得到'连接必须打开以执行此操作'的异常。为什么连接在执行ExecuteNonQuery()方法后会自动关闭?

有谁能告诉我如何解决这种情况? 在第二个命令对象中,我只是尝试提交更改,没有别的。如何在不使用事务的情况下提交更改?

先谢谢

**

  

修改

** 只是想知道,打开和关闭连接的最佳做法是什么?我们应该在每个ExecuteNonQuery(),ExecuteScalar()等处打开连接。方法和密切连接只要在应用程序启动时完成或打开连接并保持连接打开直到应用程序结束?请指教!!

2 个答案:

答案 0 :(得分:4)

  

如何在不使用的情况下提交更改   交易?

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

答案 1 :(得分:1)

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

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

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();
}