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

      

  • 相关阅读:
    集中式(SVN)和分布式(Git)版本控制系统的简单比较
    Mac 提示安装包已损坏
    React 获取 url 参数 —— this.props.match
    编写一个 Chrome 浏览器扩展程序
    webpack 配置学习笔记
    Python 进阶学习笔记
    Python 入门学习笔记
    (转)Unity3d各种坑
    unity3d 网页游戏客户端工程构建方案
    (转)在Unity3D的网络游戏中实现资源动态加载
  • 原文地址:https://www.cnblogs.com/HandLoong/p/8985920.html
Copyright © 2011-2022 走看看