1

ユーザーの知識に応じて、firebird 組み込みおよび/または postgres を使用するアプリケーションを開発しています。firebird 組み込みの議論は、インストール、ファイアウォール、UAC などの問題が少ないはずだということです。これまでのところ、postgres は雲の上を歩くようなものですが、firebird で障害物にぶつかりました。アプリは .net で、このプロバイダーを使用していますhttp://www.firebirdsql.org/en/net-provider/バージョン 3.0.2

技術的にはすべて機能しますが、firebird が埋め込まれている場合、1 秒あたり約 100 レコードしか挿入できませんが、postgres では 1 秒あたり 3000 を超えます! postgres を使用して、大量の INSERT INTO... ステートメントを 1 つのコマンドとして起動しますが、問題ありません。firebirdの場合、うまくいきません。これが(ゆっくりと)機能するものです

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

ただし、解析なしでやろうとしています。ここでの2番目の回答に似たもの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

最初の方法だけですか?とても遅いです:(

4

2 に答える 2

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 に答える