zoukankan      html  css  js  c++  java
  • 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;
            }
    

      

  • 相关阅读:
    两种常用图像识别迁移学习方法
    学习备忘
    图像处理代码举例(C++、MATLAB、OpenCV)
    Java 读取clob字段的几种方法
    Oracle 查询表注释以及字段注释
    Oracle 查询表的索引包含的字段
    Oracle 获取表的主键、外键以及唯一约束条件
    Oracle列信息表 all_tab_columns中的data_length和data_precision字段区别
    Oracle 表结构、索引以及分区信息查询
    Java中的String,StringBuilder,StringBuffer三者的区别
  • 原文地址:https://www.cnblogs.com/HandLoong/p/8985920.html
Copyright © 2011-2022 走看看