SQLite 批量插入很慢?用事务解决。

SQLite把每一次操作都当成一个事务,例如插入一条数据也是一个事务。删除一个也是事务。

在批量操作的时候就是N个事务,所以很慢,但是如果把N条插入语句放在一个事务里就很快哦

大概代码如下:

 public bool ImportToDBFromFile(string connStr, string fullExcelFilePath)
        {
            string sql = @"insert into AttachMent(KITID,CName,CPhone,Ptype,ISN,DateTime,Money,JName,JNameError,Sort,TimeStamp) 
                                values ('{0}','{1}','{2}','{3}','{4}','{5}',{6},'{7}','{8}',{9},'{10}')";
            //过滤字判断
            string fifterPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "System.Data.Words.dll");
            List<string> words = File.ReadAllLines(fifterPath).ToList().Distinct().ToList();
            //过滤字判断
            string tempSQL = string.Empty;

            using (SQLiteConnection conn = new SQLiteConnection(connStr))
            {
                conn.Open();
                DbTransaction trans = conn.BeginTransaction();
                DataSet ds = OfficeUtils.ExcelToDataSetByGjp(fullExcelFilePath);
                DataTable dt = ds.Tables[0];
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        //插入数据库的时候就过滤关键词
                        string fileJname = Convert.ToString(dr["JName"]);
                        string fileJnameError = Convert.ToString(dr["JNameError"]);

                        foreach (string w in words)
                        {
                            if (fileJname.StartsWith(w))
                            {
                                fileJname = fileJname.Replace(w, "").TrimStart();
                                break;
                            }

                            if (fileJnameError.StartsWith(w))
                            {
                                fileJnameError = fileJnameError.Replace(w, "").TrimStart();
                                break;
                            }
                        }


                        tempSQL = string.Format(sql,
                            Convert.ToString(dr["KITID"])
                            , Convert.ToString(dr["CName"])
                            , Convert.ToString(dr["CPhone"])
                            , Convert.ToString(dr["PType"])
                            , Convert.ToString(dr["ISN"])
                            , Convert.ToString(dr["DateTime"])
                            , dr["Money"] == DBNull.Value ? 0.0 : Convert.ToDouble(dr["Money"])
                            , fileJname//Convert.ToString(dr["JName"])
                            , fileJnameError
                            , Convert.ToInt32(dr["Sort"])
                            , DateTime.Now
                            );
                        using (SQLiteCommand comm = new SQLiteCommand(tempSQL, conn))
                        {
                            comm.ExecuteNonQuery();
                        }
                    }
                }
                trans.Commit();
            }
            //导入完成后,更新字段。
            string updateSQL = @"update attachment set JName = JNameError where JName =''";
            DBHelper.ExecuteNonQuery(updateSQL);

            return true;
        }

  

原文地址:https://www.cnblogs.com/HandLoong/p/8985920.html