簡體   English   中英

使用.net提供程序將firebird嵌入多個插件

[英]firebird embedded multiple inserts using .net provider

我正在開發一個應用程序,該應用程序將根據用戶的復雜程度使用firebird嵌入式和/或postgres。 火鳥嵌入式的觀點是應該減少安裝,防火牆,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

第一種方法是唯一的方法嗎? 太慢了:(

您不需要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 ,例如Flamerobin也支持它。

使用諸如Firebird .NET提供程序及其FbCommand對象之類的驅動程序,您正在執行一條語句,因此不需要語句終止符(Firebird服務器也不支持它們),因此既不需要也不支持SET TERM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM