firebird使用.net提供程序嵌入多个插入

时间:2013-07-26 13:18:18

标签: c# .net firebird firebird-embedded

我正在开发一个应用程序,它将使用firebird嵌入式和/或postgres,具体取决于用户的复杂程度。 firebird嵌入式的论点是应该减少安装,防火墙,UAC等问题。到目前为止,postgres就像在云上行走一样,但我遇到了火鸟的路障。该应用是.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);

但是,我试图在没有解析的情况下做。类似于第二个答案Run multiple insert queries against firebird database using isql或此处http://www.firebirdfaq.org/faq336/

的内容
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

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

2 个答案:

答案 0 :(得分:5)

您不需要set term语句,这些语句是isql specific thing。所以试试

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";

答案 1 :(得分:1)

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

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

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