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