Firebird EXECUTE BLOCK 从 c# 和 Flamerobin 中抛出错误 104

Firebird EXECUTE BLOCK throwing error 104 from c# and Flamerobin

我想使用 EXECUTE BLOCK AS BEGIN ... END 语句执行几个查询。

所以我继续尝试我的第一个条目 - 脚本看起来很简单:

UPDATE OR INSERT INTO MY_TABLE (ID, VALUE) VALUES ('1', 'First Entry');

所以我 运行 这一切都很好。接下来我把它放到一个执行块中:

EXECUTE BLOCK AS
BEGIN
UPDATE OR INSERT INTO MY_TABLE (ID, VALUE) VALUES ('1', 'First Entry');
END

现在,我在第 3 行 ; 字符处收到错误 104 isc_dsql_prepare failed 错误:Unexpected end of command - line 4, column 70。当我在 FlameRobin 中 运行 时,我得到了同样的错误,但是当我在 DBWorkbench 中执行完全相同的代码时一切正常...

任何人都可以解释可能是什么问题吗?

更新 下面是我如何通过 C# 执行块:

 string sql = "EXECUTE BLOCK AS BEGIN .... END";
 DbLive.Open();
 FbCommand command = new FbCommand(sql, DbLive);
 command.ExecuteNonQuery();

假设您将前面发布的执行块与 C# 代码块结合使用,那么您实际上有两个明显的错误,一个在 Flame Robin 中(命令意外结束) , 和 C# 中的一个(令牌未知或)。

Flame Robin 中的问题可以通过在switch 语句终止符的开头添加set term #; 来解决。目前,Flame Robin 将执行块内的 ; 解释为向服务器发送语句的信号。另见 Error -104 Unexpected end of command creating a Firebird stored procedure

如果您这样做,您将得到与您的 C# 代码中相同的错误:

An unhandled exception of type 'FirebirdSql.Data.FirebirdClient.FbException' occurred in FirebirdSql.Data.FirebirdClient.dll
Additional information: Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 31
or

这个错误的原因是Firebird中没有以insert or update开头的DML语句,应该使用update or insert (or merge).

我需要 2 个步骤来解决问题:

1) 在C#代码中使用ExecuteScalar

string sql = "EXECUTE BLOCK AS BEGIN .... END";
DbLive.Open();
FbCommand command = new FbCommand(sql, DbLive);
command.ExecuteScalar();

2) 完全不使用 SET TERM,而是确保块的大小不会太大。对 sql 字符串大小进行简单测试就足够了(归功于 Elias thanks to the comment in this post)。

更新 升级到最新的 Firebird 提供程序后(至于撰写本文时,它是 v.5.7.0.0),ExecuteScalarExecuteNonQuery 都可以工作。

另请注意,由于有很多触发器,我对大小测试进行了智能化以包括所述的 sql 长度,但还添加了一个查询计数器,以限制两个块的长度和查询数量。