我正在开发一个应用程序,它将使用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
第一种方式是唯一的方法吗?它太慢了:(
答案 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
没有必要也没有支持。