5

次のコマンドを使用して、Firebird のデータベース内のすべてのテーブルを削除しようとしています。

string dropAllForeignKeysSql =
  "EXECUTE BLOCK RETURNS (stmt VARCHAR(1000)) AS "+
  "BEGIN "+
  "FOR "+
  "select 'alter table \"'||r.rdb$relation_name ||'\" drop constraint '||r.rdb$constraint_name||';' "+
  "from rdb$relation_constraints r "+
  "where (r.rdb$constraint_type='FOREIGN KEY') "+
  "into :stmt "+
  " DO begin execute statement :stmt; end "+
  "END "+
  ";";

using (var connection = sessionFactory.OpenSession().Connection)
  {
    var command = connection.CreateCommand();
    command.CommandText = dropAllForeignKeysSql;
    command.ExecuteNonQuery();
  }

残念ながら、コマンドは実行されません。ただし、デバッガーを一時停止し、CommandText変数に文字列をコピーして、コードではなく手動でクエリを実行すると、ステートメントが実行されます。CommandText を のような単純なコマンドに置き換えると、DROP TABLE myTableこのコマンドがコード内で実行されます。つまり、テーブルが削除されます。コードを実行してもエラーはスローされません (意図的に間違ったコマンドを入力したり、外部ツールでデータベースを開いた場合とは対照的です)。

そこから、エラーは SQL ステートメントにあるのではなく、コマンドのセットアップにあるのでも、間違った接続のセットアップにあるのでもないと結論付けます。エラーは他にどこにありますか?

4

1 に答える 1

0

FbBatchExecution を使用する必要があります

FirebirdSql.Data.FirebirdClient.FbTransaction fbt = fbc.BeginTransaction(); // object fbc is your FirebirdSql.Data.FirebirdClient.FbConnection

FirebirdSql.Data.Isql.FbBatchExecution fbe = new FirebirdSql.Data.Isql.FbBatchExecution(fbc);
fbe.SqlStatements.Add(dropAllForeignKeysSql); // Your string here

fbe.Execute(true);

fbt.Commit();

開始スクリプトの前に「term」を変更します。

SET term #;
于 2013-06-19T08:32:22.737 に答える