如何在C#for Firebird中执行block语句

如何在C#for Firebird中执行block语句,c#,sql,firebird,C#,Sql,Firebird,我正在尝试使用以下命令删除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 rd

我正在尝试使用以下命令删除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语句中,也不在命令设置中,也不在设置了错误的连接中。错误可能在哪里?

您应该使用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();
并在开始脚本之前更改“术语”:

SET term #;

不是100%确定,但我认为您需要删除动态构造查询末尾的分号(
)。分号不是Firebird查询语言的一部分。不幸的是,这不是原因。执行生成的查询字符串可以正常工作(有分号和没有分号)。是否尝试将换行符添加到每个连接行?是否有任何方法可以跟踪ExecuteOnQuery在数据库服务器上执行的实际sql查询?是的,但这对结果没有影响。问题还可能与以下事实有关:列
rdb$relation\u name
是一个字符(31),因此填充了空格。尝试使用
TRIM
。执行此操作时,我发现错误
无法确定SQL语句的类型。
删除设置的TERM语句会导致
批执行中止返回的消息是:当分配给命令的连接对象处于挂起的本地事务中时,执行要求命令对象具有事务对象。命令的事务属性尚未初始化。
忽略事务时,此消息会奇怪地消失,代码运行正常,但在这种情况下,不会再次删除约束。Firebird引擎版本是什么?Firebird client 3.0.2.1 for Ado.NET,Firebird 2.5.2.26539-0 Win32作为嵌入式引擎,Firebird 2.5.2.26539 Win32在使用服务器时version@Dani:您还记得上面事务错误消息的原因吗?我这里也有同样的问题。(2.5.3.26778.ds4-5)@lenniep恐怕不行;我们放弃了声明方法:-|