次のコマンドを使用して、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 ステートメントにあるのではなく、コマンドのセットアップにあるのでも、間違った接続のセットアップにあるのでもないと結論付けます。エラーは他にどこにありますか?