Я запускаю несколько команд SQL, используя провайдера dot net для Firebird в С#. В частности, я меняю схему базы данных, делаю обновления данных и тому подобное.
В рамках обработки я создаю новую таблицу, запускаю запрос на копирование данных из старой таблицы, а затем удаляю старую таблицу.
Когда я делаю это, firebird генерирует ошибку:
используется неудачный объект обновления метаданных
Я кое-что посмотрел, и кажется, что запрос на копирование данных еще не "очищен" или что-то в этом роде. Я имею в виду, что когда я проверяю таблицы мониторинга в Firebird с приостановленным выполнением С#, я вижу запрос в таблице MON$STATEMENTS
как неактивный. Это после того, как я запустил оператор фиксации.
Мои вопросы:
Есть ли способ приостановить, подождать или заставить запрос полностью завершиться, прежде чем я попытаюсь запустить следующую команду?
Когда я запускаю ту же последовательность запросов в ISQL, она работает отлично. Есть ли что-то другое, что ISQL делает, что я могу заставить поставщика dot net Firebird сделать, чтобы он не держал этот запрос открытым или что-то в этом роде?
Итак, для справки код выглядит примерно так (очевидно, это очень упрощенно):
// create the table
string commandString = "CREATE TABLE ...";
// run the command in a transaction and commit it
mtransaction = Connection.BeginTransaction( IsolationLevel.Serializable );
FbCommand command = new FbCommand(commandString, Connection, mtransaction);
command.ExecuteNonQuery();
transaction.Commit();
transaction.Dispose();
transaction = null;
// copy the data to the new table from the old
commandString = "INSERT INTO ...";
mtransaction = Connection.BeginTransaction(IsolationLevel.Serializable);
FbCommand command = new FbCommand(commandString, Connection, mtransaction);
command.ExecuteNonQuery();
transaction.Commit();
transaction.Dispose();
transaction = null;
// drop the old table
commandString = "DROP TABLE ...";
mtransaction = Connection.BeginTransaction(IsolationLevel.Serializable);
FbCommand command = new FbCommand(commandString, Connection, mtransaction);
command.ExecuteNonQuery();
// this command fails with the exception
// if I pause execution in c# before running this command, and
// use isql to look at the db I see the new table, and the data fully populated
// and I also see the inactive insert command in MON$STATEMENTS
transaction.Commit();
transaction.Dispose();
transaction = null;