首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebird从c#和Flamerobin执行块抛出错误104

Firebird从c#和Flamerobin执行块抛出错误104
EN

Stack Overflow用户
提问于 2016-12-05 14:42:26
回答 2查看 1.5K关注 0票数 2

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

因此,我继续尝试我的第一个条目-脚本看起来非常简单:

代码语言:javascript
复制
UPDATE OR INSERT INTO MY_TABLE (ID, VALUE) VALUES ('1', 'First Entry');

所以我把这一切都做得很好。接下来,我将其放入执行块中:

代码语言:javascript
复制
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#执行块:

代码语言:javascript
复制
 string sql = "EXECUTE BLOCK AS BEGIN .... END";
 DbLive.Open();
 FbCommand command = new FbCommand(sql, DbLive);
 command.ExecuteNonQuery();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-08 10:14:56

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

1)在ExecuteScalar代码中使用C#:

代码语言:javascript
复制
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),ExecuteScalarExecuteNonQuery都在工作。

还请注意,由于有很多触发器,我使大小测试的智能包括了前面提到的sql长度,但也添加了一个查询计数器,以限制块的长度和查询的数量。

票数 0
EN

Stack Overflow用户

发布于 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)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40976843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档