最近一直在用,也一直在学oralc,项目上也用到了批量的添加(读取上传CSV文件信息,把符合条件的信息写入到数据库中),在写的时候想到了可能是数据量大就想该怎么快,(由于本人在.NET开发期间没有做过深度的优化)
1 private string GUID;//序号GUID唯一标识 2 private string filename;//文件名称 3 private string lmportl_ID;//导入ID 4 private Int32? lmportl_date;//导入时间 5 private string diflag;// 国际/国内标识 DIFlag
上传CSV文件有专门的方法,只要复制进去就好了
#region 将CSV文件的数据读取到DataTable中 /// <summary> /// 将CSV文件的数据读取到DataTable中 /// </summary> /// <param name="fileName">CSV文件路径</param> /// <returns>返回读取了CSV数据的DataTable</returns> public static DataTable OpenCSV(string filePath) { DataTable dt = new DataTable(); FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); StreamReader sr = new StreamReader(fs, Encoding.UTF8); //StreamReader sr = new StreamReader(fs, encoding); //string fileContent = sr.ReadToEnd(); //记录每次读取的一行记录 string strLine = ""; //记录每行记录中的各字段内容 string[] aryLine = null; string[] tableHead = null; //标示列数 int columnCount = 0; //标示是否是读取的第一行 bool IsFirst = true; //逐行读取CSV中的数据 while ((strLine = sr.ReadLine()) != null) { if (IsFirst == true) { tableHead = strLine.Split(','); if (tableHead.Length > 3) //截取列数 tableHead = tableHead.Skip(0).Take(3).ToArray(); IsFirst = false; columnCount = tableHead.Length; //创建列 for (int i = 0; i < columnCount; i++) { tableHead[i] = tableHead[i].Replace(""", ""); DataColumn dc = new DataColumn(tableHead[i]); dt.Columns.Add(dc); } } else { aryLine = strLine.Split(','); if (aryLine.Length > 3) aryLine = aryLine.Skip(0).Take(3).ToArray(); DataRow dr = dt.NewRow(); //是否超过1000行 if (dt.Rows.Count <= 1000) { //Prefix和FormType字符串长度是否超过3 if (aryLine[0].Length <= 3 && aryLine[1].Length <= 3) { dr[0] = aryLine[0].Replace(""", ""); dr[1] = aryLine[1].Replace(""", ""); } else { dr[0] = aryLine[0].Substring(0, 3); dr[1] = aryLine[1].Substring(0, 3); } //TicketNo 字符串长度是否超过8 if (aryLine[2].Length <= 8) { dr[2] = aryLine[2].Replace(""", ""); } else { dr[2] = aryLine[2].Substring(0, 8); } } else { return dt;//跳出程序,行数大于1000,不做添加, } dt.Rows.Add(dr); } } if (aryLine != null && aryLine.Length > 0) { dt.DefaultView.Sort = tableHead[2]; } sr.Close(); fs.Close(); return dt; } #endregion
上传完成的CSV文件返回的DataTable 我需要把DataTable 转货成List,我们用的EF所以可以直接转换
DataEnt = DataConvertor.GetEntityList<t>(dtb) as List<T>;
把List传入方法中
#region 插入票号转换数据到表 /// <summary> /// 插入票号转换数据到表 /// </summary> /// <param name="">表的实体</param> /// <returns></returns> public BaseEntityJsonObject<int> Insert_TRANSFER(List<T> T) { BaseEntityJsonObject<int> result = new BaseEntityJsonObject<int>(); int count = 0; string strSql = ""; try { StringBuilder strBuilder = new StringBuilder(); strBuilder.Append("INSERT INTO 表名( 字段明,字段明,字段明) "); strBuilder.Append("select sequence_name.nextval ,t.c1,t.c2,t.c3,t.c4,t.c5 FROM ( "); foreach (var item in T) { strBuilder.Append(" SELECT "); strBuilder.Append("'" + item.字段名+ " 'C1,'" + item.字段名+ " 'C2,'" + item.字段名+ "' C3,"); strBuilder.Append("'字段名' C4 ,'" + 字段名+ "' C5 FROM DUAL union all "); } strBuilder.Append(" ) T"); strSql = string.Format(strBuilder.ToString()); int i = 14; //sql写完后这里嘚坐sql的截取,要不然会报错 strSql = strSql.Remove(strSql.Length - i, 11); count = DbContext.Database.ExecuteSqlCommand(strSql); } catch (Exception ex) { ExceptionHandler.HandleException(ex); } return result; } #endregion
这就是添加!
下面写批量修改
写修改前先要把要修稿的数据查询出来,转货成LIst,我就不说怎么查询,怎么转货List了
我这里写的流程是先把List写进数据库的视图中,然后数据插进伪表中 然后根据伪表中的数据做进一步的条件,不说了,直接上代码
#region 修改转换数据到表 /// <summary> /// 修改转换数据到表 /// </summary> /// <param name="">表的实体</param> /// <returns></returns> public BaseEntityJsonObject<int> Update_TRANSFER(List<T> T) { BaseEntityJsonObject<int> result = new BaseEntityJsonObject<int>(); int count = 0; string strSql = ""; try { StringBuilder strBuilder = new StringBuilder(); strBuilder.Append(" MERGE INTO TRT_TICKETNUMBER_TRANSFER T1 USING ( "); //从这里循环要修改的数据,把数据先临时放到伪表中 foreach (var item in t) { strBuilder.Append(" SELECT '" + item.要修改的字段名+ "' a, '" + item.要修改的字段名+ "' b FROM DUAL t "); strBuilder.Append(" union all "); } string str2 = strBuilder.ToString(); if (str2 != "") { str2 = str2.Remove(str2.Length - 10); } //把sql进行截取,要不然会报错,然后在拼接SQL语句 StringBuilder strBuilder2 = new StringBuilder(); strBuilder2.Append(" ) T2 ON ( T1.表中的主键字段 = T2.a 临时表的字段 ) "); strBuilder2.Append(" WHEN MATCHED THEN "); strBuilder2.Append(" UPDATE SET T1.需要修改的字段名 = t2.b"); strSql = str2 + strBuilder2.ToString(); count = DbContext.Database.ExecuteSqlCommand(strSql); result.payload = count; result.errorCode = 0; } catch (Exception ex) { ExceptionHandler.HandleException(ex); LogHelper.Error(string.Format("添加表数据失败"), ex); } return result; } #endregion
这样就完成了数据的修改,
由于临时想起来写博客,没有准备充分,
有什么不妥的欢迎大家指出,欢迎大家吧问题指出来,然后大家共同进步