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),ExecuteScalar
和 ExecuteNonQuery
都可以工作。
另请注意,由于有很多触发器,我对大小测试进行了智能化以包括所述的 sql
长度,但还添加了一个查询计数器,以限制两个块的长度和查询数量。
我想使用 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),ExecuteScalar
和 ExecuteNonQuery
都可以工作。
另请注意,由于有很多触发器,我对大小测试进行了智能化以包括所述的 sql
长度,但还添加了一个查询计数器,以限制两个块的长度和查询数量。