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