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

本文关键字:插件 程序 使用 net firebird | 更新日期: 2023-09-27 18:25:07

我正在开发一个应用程序,该应用程序将根据用户的复杂程度使用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);

然而,我正在尝试不进行解析。类似于这里的第二个答案使用isql或这里对firebird数据库运行多个插入查询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

第一条路是唯一的路吗?它太慢了:(

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

您不需要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";

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

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

对于像Firebird.NET提供程序及其FbCommand对象这样的驱动程序,您执行的是一条语句,因此不需要语句终止符(Firebird服务器也不支持它们),因此SET TERM不是必需的,也不受支持。