0

我插入这样的数据,但时间太长

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

如何插入更快?

4

3 回答 3

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
于 2013-09-14T08:22:11.823 回答
0

首先,尝试StringBuilder用于字符串连接。其次,您正在发出34k请求,这很慢,请尝试减少请求的数量。假设使用 StringBuilder5k在一个中连接插入语句并在事务中触发它,这样做直到您的所有数据都不会被保存。

于 2013-09-14T08:14:37.690 回答
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();
}
于 2013-09-14T08:19:11.450 回答