2013-09-14 5 views
0

Я вставляю данные, как это, но это занимает слишком много времени.Вставка в SqlLite занимает слишком много времени

Для 34 000 записей потребовалось 20 минут! (например, если я вставляю в SQL Server CE, это заняло всего 3 минуты)

conn_sql = new SQLiteConnection(conn_str2); 
conn_sql.Open(); 
cmd_sql = conn_sql.CreateCommand(); 

for (int i = 0; i < iTotalRows; i++) 
{ 
    try 
    { 
     Makat = dsView.Tables["Items"].Rows[i]["Makat"].ToString().Trim(); 
    } 
    catch { Makat = ""; } 

    try 
    { 
     Barcode = dsView.Tables["Items"].Rows[i]["Barcode"].ToString().Trim(); 
    } 
    catch { Barcode = ""; } 

    try 
    { 
     Des = dsView.Tables["Items"].Rows[i]["Des"].ToString().Trim(); 
    } 
    catch { Des = ""; } 

    try 
    { 
     Price = dsView.Tables["Items"].Rows[i]["Price"].ToString().Trim(); 
    } 
    catch { Price = ""; } 

    SQL = "INSERT INTO Catalog(Makat,Barcode,Des,Price)VALUES('" + Makat + "','" + Barcode + "','" + Des + "','" + Price + "')"; 
    cmd_sql.CommandText = SQL; 
    cmd_sql.CommandType = CommandType.Text; 

    cmd_sql.ExecuteNonQuery(); 

    //cmd_sql.Dispose(); 
} 

Как вставить быстрее?

+0

Вы обновляете 'Таблицы [" Items "]' в своем приложении и вставляете в 'Catalog' таблицы или просто читать из другой таблицы? – Damith

ответ

2

SQLite неявно оборачивает запросов в рамках транзакции. Начало и совершение транзакций в цикле может замедлить работу. Я думаю, вам следует значительно повысить скорость, если вы начнете транзакцию и зафиксируете ее после завершения цикла:

conn_sql.Open(); 
using(var tran = conn_sql.BeginTransaction()) // <--- create a transaction 
{ 
    cmd_sql = conn_sql.CreateCommand(); 
    cmd_sql.Transaction = tran;   // <--- assign the transaction to the command 
               
    for (int i = 0; i < iTotalRows; i++) 
    { 
      // ... 
      cmd_sql.CommandText = SQL; 
      cmd_sql.CommandType = CommandType.Text; 
      cmd_sql.ExecuteNonQuery(); 
      //cmd_sql.Dispose(); 

    } 
    tran.Commit(); // <--- commit the transaction 
} // <--- transaction will rollback if not committed already 
+0

спасибо !! это работает !! – Gold

0

Сначала попробуйте использовать StringBuilder для конкатенации строк. Во-вторых, вы делаете запросы 34k, и это медленно, попробуйте сделать меньше запросов. Пусть, скажем, используя StringBuilder concatenate 5k вставьте инструкции в один и запустите его в транзакции, сделайте это, пока все ваши данные не будут сохранены.

0

Если вы делаете это в одной транзакции она должна быть быстрее:

SqlTransaction transaction; 
try 
{ 
    conn_sql = new SQLiteConnection(conn_str2); 
    conn_sql.Open(); 
    cmd_sql = conn_sql.CreateCommand(); 

    transaction = conn_sql.BeginTransaction(); 

    for (int i = 0; i < iTotalRows; i++) 
    { 
     // create SQL string 
     cmd_sql.CommandText = SQL; 
     cmd_sql.CommandType = CommandType.Text; 
     cmd_sql.ExecuteNonQuery(); 
    } 

    transaction.Commit(); 
} 
catch 
{ 
    transaction.Rollback(); 
} 
Смежные вопросы