Как выполнить два метода command.ExecuteNonQuery (), используя одно соединение? - PullRequest
1 голос
/ 08 сентября 2010

Я пытаюсь вызвать метод ExecuteNonQuery () двух разных объектов класса OracleCommand. Оба объекта используют один и тот же объект подключения, но имеют разные 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 ()?

Может кто-нибудь сказать, пожалуйста, как справиться с этой ситуацией? Во втором объекте команды я просто пытаюсь зафиксировать изменения, больше ничего. Как зафиксировать изменения без использования транзакций?

Заранее спасибо

**

EDIT

** Просто хотел узнать, как лучше всего открывать и закрывать соединение? Должны ли мы открывать соединение для каждого ExecuteNonQuery (), ExecuteScalar () и т. Д. методы и закрыть соединение, пока сделано, или открыть соединение при запуске приложения и держать соединение открытым до конца приложения? Пожалуйста, просветите!

Ответы [ 2 ]

4 голосов
/ 08 сентября 2010

Как зафиксировать изменения без использования сделки?

Это не имеет никакого смысла. Если вы явно не используете транзакцию, изменения фиксируются автоматически.

1 голос
/ 08 сентября 2010

Какая у вас команда на коммит? Это просто для того, чтобы совершить работу? В этом случае вам не нужно будет делать это, поскольку транзакция будет неявно создана и зафиксирована при выполнении первого запроса, нравится вам это или нет.

Если оба запроса необходимо выполнить и зафиксировать как единое целое, похоже, что вы захотите использовать транзакции

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