如何在C#中为Firebird执行块语句

时间:2013-04-30 05:57:34

标签: 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 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语句中,也不在命令设置中,也没有设置错误的连接。还有什么地方可以出错?

1 个答案:

答案 0 :(得分: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 #;