【发布时间】:2013-04-23 23:23:16
【问题描述】:
我正在尝试使用以下命令删除 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 变量中的字符串并手动执行查询/而不是在代码中执行该语句。如果我用更简单的命令(如DROP TABLE myTable)替换 CommandText,则此命令将在代码中执行,即删除表。运行代码时不会抛出错误(与我故意输入错误命令或在外部工具中打开数据库时相比)。
从那里,我得出结论,错误不在 SQL 语句中,也不在命令设置中,也不是在设置错误的连接中。错误还可能在哪里?
【问题讨论】:
-
不是 100% 确定,但我认为您需要在动态构造的查询末尾删除分号 (
;)。分号不是 Firebird 查询语言的一部分。 -
不幸的是,这不是原因。执行生成的查询字符串工作正常(带和不带分号)。
-
您是否尝试在每个连接的行中添加换行符?有什么方法可以跟踪数据库服务器上 ExecuteNonQuery 执行的实际 sql 查询?
-
可以,但这对结果没有影响。
-
问题也可能与列
rdb$relation_name是一个CHAR(31) 并因此用空格填充的事实有关。尝试使用TRIM。