我正在尝试使用以下命令删除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();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,该命令未执行。但是,当我暂停调试器时,将字符串复制到CommandText变量中并手动执行查询(而不是在代码中执行),该语句将被执行。如果我将CommandText替换为更简单的命令(例如)DROP TABLE myTable,则该命令将在代码中执行,即删除表。运行代码时不会引发任何错误(与故意输入错误命令或在外部工具中打开数据库的情况相反)。
从那里,我得出结论,错误不在SQL语句中,也不在命令设置中,也没有建立错误的连接。错误可能在哪里?
您应该使用 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();
Run Code Online (Sandbox Code Playgroud)
并在开始脚本之前更改“term”:
SET term #;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2509 次 |
| 最近记录: |