2012-01-31 1 views
2

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

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 я бы только что запустил cachedupdates. разместить 500 записей в то время и фиксации на 500th

Благодарности

+1

Вы пробовали поместить все это в сделку? –

+0

нет, любые указатели на то, как это сделать? – Crudler

ответ

1

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

Например:

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

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

BTW FbBatchExecution также отправит одну команду.

+0

, чтобы вы могли объяснить блок выполнения немного больше для меня. спасибо – Crudler

+0

Проверьте ссылку и пример, который я добавил к сообщению. –

4

попробовать что-то вроде этого:

using(FbConnection c = new FbConnection(csb.ToString())) 
{ 
    FbBatchExecution fbe = new FbBatchExecution(c); 
    //loop through your commands here 
    { 
     fbe.SqlStatements.Add(cmd); 
    } 
    fbe.Execute(); 
} 
+0

делает каждый оператор вставки получить свою собственную команду? – Crudler

+0

Да! попробуйте добавить свой код по другому методу, который возвращает команду, готовую к выполнению, и вызовет этот метод в цикле – Diego

1

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

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

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

в петле сделать:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^