我有几个查询想要使用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行的;字符:Unexpected end of command - line 4, column 70处得到了一个错误Unexpected end of command - line 4, column 70错误。当我在FlameRobin中运行时,我得到了相同的错误,但是当我在DBWorkbench中执行这段完全相同的代码时,所有的错误都运行得很好。
有人能解释一下这个问题是什么吗?
UPDATE在这里如何通过C#执行块:
string sql = "EXECUTE BLOCK AS BEGIN .... END";
DbLive.Open();
FbCommand command = new FbCommand(sql, DbLive);
command.ExecuteNonQuery();发布于 2016-12-08 10:14:56
我需要两个步骤来解决这个问题:
1)在ExecuteScalar代码中使用C#:
string sql = "EXECUTE BLOCK AS BEGIN .... END";
DbLive.Open();
FbCommand command = new FbCommand(sql, DbLive);
command.ExecuteScalar();2)完全不使用SET TERM,而是确保块的大小不太大。对sql字符串大小进行简单测试就足够了(多亏了this post中的注释,这是Elias的功劳)。
在升级到最新的火鸟提供程序后更新(就编写本报告时而言,它是5.7.0.0),ExecuteScalar和ExecuteNonQuery都在工作。
还请注意,由于有很多触发器,我使大小测试的智能包括了前面提到的sql长度,但也添加了一个查询计数器,以限制块的长度和查询的数量。
发布于 2016-12-06 08:05:16
假设您使用前面发布的与C#代码块相结合的执行块,那么您实际上有两个不同的错误,一个是Flame (命令的意外结束),另一个是C# (令牌未知或)。
Flame中的问题可以通过在开始时添加set term #;来切换语句终止符来解决。目前,Flame将执行块中的;解释为将语句发送到服务器的信号。另见Error -104 Unexpected end of command creating a Firebird stored procedure
如果这样做,您将得到与C#代码相同的错误:
FirebirdSql.Data.FirebirdClient.FbException类型的未处理异常发生在FirebirdSql.Data.FirebirdClient.dll中 附加信息:动态SQL错误 SQL错误代码= -104 令牌未知-第1行,第31列 或
造成此错误的原因是在Firebird中没有以insert or update开头的DML语句,而应该使用update or insert (或merge)。
https://stackoverflow.com/questions/40976843
复制相似问题