1

我正在开发一个应用程序,它将根据用户的复杂程度使用嵌入的 firebird 和/或 postgres。firebird 嵌入式的论点是应该减少安装、防火墙、UAC 等问题。到目前为止,postgres 就像在云端行走,但我遇到了 firebird 的障碍。该应用程序是 .net,我正在使用此提供程序http://www.firebirdsql.org/en/net-provider/版本 3.0.2

从技术上讲,一切正常,但嵌入 firebird 时,我每秒只插入大约 100 条记录,而使用 postgres 时每秒超过 3000 条!使用 postgres,我将大量 INSERT INTO... 语句作为一个命令启动,这很好。对于火鸟来说,进展并不顺利。这是有效的(慢慢地)

String query = @"INSERT INTO Customers(ID, Name, SiteID) VALUES(1,'delta',2);
INSERT INTO Customers(ID, Name, SiteID) VALUES(2,'phoenix',2);
";
FbScript fbs = new FbScript(query);
fbs.Parse();
FbConnection fbc = new FbConnection(ConnectionString);

FbBatchExecution fbe = new FbBatchExecution(fbc, fbs);
fbe.Execute(true);

但是,我正在尝试不进行解析。类似于此处的第二个答案使用 isql或此处http://www.firebirdfaq.org/faq336/对 firebird 数据库运行多个插入查询

String sql = @"set term ^ ;
EXECUTE BLOCK AS BEGIN
INSERT INTO Customers(ID, Name, SiteID) VALUES(1,'delta',2);
INSERT INTO Customers(ID, Name, SiteID) VALUES(2,'phoenix',2);
end^";

FbCommand cmd = new FbCommand();            
PrepareCommand(cmd, connection, (FbTransaction)null, CommandType.Text, sql, commandParameters, out mustCloseConnection);
cmd.ExecuteNonQuery();

有了这个我得到了例外

Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 5
term

第一种方法是唯一的方法吗?太慢了:(

4

2 回答 2

6

你不需要这些set term陈述,这些是isql 具体的事情。所以试试

String sql = @"EXECUTE BLOCK AS BEGIN
INSERT INTO Customers(ID, Name, SiteID) VALUES(1,'delta',2);
INSERT INTO Customers(ID, Name, SiteID) VALUES(2,'phoenix',2);
END";
于 2013-07-26T13:40:13.473 回答
1

Ain 已经给出了如何解决这个问题的答案,但作为解释:像 isql 这样的命令行工具需要知道语句何时完成并且可以执行。他们;用作终结者。但是在 PSQL 块中(存储过程和EXECUTE BLOCK;也是语句终止符。

为了防止 isql 工具向服务器发送不完整的语句(从而导致解析器错误),SET TERM存在用于切换命令行 (isql) 的语句终止符的命令。现在 isql 不是唯一使用SET TERM的,例如 flamerobin 也支持它。

使用像 Firebird .NET 提供程序及其FbCommand对象这样的驱动程序,您正在执行单个语句,因此不需要语句终止符(Firebird 服务器也不支持它们),因此SET TERM不需要也不支持。

于 2013-07-27T08:07:04.407 回答