Пакетные вставки Firebird dotnet - PullRequest
2 голосов
/ 31 января 2012

Может кто-нибудь помочь мне ускорить это. У меня есть набор данных (из файла CSV) с именем dsresult, и я хочу закачать его в таблицу Firebird. В настоящее время я делаю это по 1 строке за раз, но я бы предпочел делать это партиями по 500 строк. Я пользуюсь провайдером firebird.net

string connectionString =    "ServerType=1;User=SYSDBA;Password=masterkey;Dialect=3;Database=MYDB.FDB";
string sql = "INSERT INTO POSTIN (NUMID, CHANGE, PLACENAME, BOXCODE, STRCODE, TOWN)  VALUES (@NUMID, @CHANGE, @PLACENAME, @BOXCODE, @STRCODE, @TOWN)";
FbConnection conn = new FbConnection(connectionString)
FbCommand command = new FbCommand(sql, conn);                   
foreach (DataRow r in dsResult.Tables[0].Rows)
 {
  command.Parameters.AddWithValue("@NUMID", r["NUMID"]);
  command.Parameters.AddWithValue("@CHANGE", r["CHANGE"]);
  command.Parameters.AddWithValue("@PLACENAME", r["PLACENAME"]);
  command.Parameters.AddWithValue("@BOXCODE", r["BOXCODE"]);
  command.Parameters.AddWithValue("@STRCODE", r["STRCODE"]);
  command.Parameters.AddWithValue("@TOWN", r["TOWN"]);         
  command.ExecuteNonQuery();
 }

требуется бегство aaaaaaaaaaages. в Delphi я бы просто jused cachedupdates. размещать 500 записей одновременно и совершить на 500

Спасибо

Ответы [ 3 ]

4 голосов
/ 31 января 2012

попробуйте что-то вроде этого:

using(FbConnection c = new FbConnection(csb.ToString()))
{
    FbBatchExecution fbe = new FbBatchExecution(c);
    //loop through your commands here
    {
        fbe.SqlStatements.Add(cmd);
    }
    fbe.Execute();
}
1 голос
/ 02 февраля 2012

Проводной протокол Firebird не поддерживает отправку большего количества команд за один пакет (и за один прием).Вероятно, лучшая идея - использовать EXECUTE BLOCK (он же анонимная хранимая процедура) и отправлять туда вставки.

Например:

execute block
as
begin
  insert into ...;
  insert into ...;
  ...
end

и выполнить это.

Кстати, FbBatchExecution также будет отправлять одну команду за раз.

1 голос
/ 02 февраля 2012

Вы должны добавить параметры только один раз и только изменить значения в цикле, например:

создать параметры один раз:

command.Parameters.Add("@NUMID", FbDbType.Int)
....

в цикле сделать:

foreach (DataRow r in dsResult.Tables[0].Rows)
{
  command.Parameters["@NUMID"].Value = r["NUMID"];
  ....
}

это действительно должно ускорить процесс.

...