SQLBulk问题集
项目中操作数据库用到这个sqlBulk
场景1:碰到数据批量插入(先加入概念吧)
sqlBC.ColumnMappings.Add(dt的列名,数据库字段);
public static string InsertTable(IDbConnection dbConn, DataTable dt, string TabelName,IEnumerable<ColumnMapInfo> fieldsList=null) { string result = "success"; //声明数据库连接 //using (SqlConnection conn = (SqlConnection)dbConn) SqlConnection conn = (SqlConnection)dbConn; { conn.Open(); //声明SqlBulkCopy ,using释放非托管资源 using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn)) { sqlBC.BulkCopyTimeout = 900;//15分钟 //一次批量的插入的数据量 sqlBC.BatchSize = 10000; //超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除 sqlBC.BulkCopyTimeout = 1000; //設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。 //sqlBC.NotifyAfter = 10000; //sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied); //设置要批量写入的表 sqlBC.DestinationTableName = TabelName; if (fieldsList!=null && fieldsList.Count()>0) { foreach (var m in fieldsList) sqlBC.ColumnMappings.Add(dt的列名,数据库字段); } //try { //批量写入 sqlBC.WriteToServer(dt); } catch (Exception ex) { result = ex.Message; } } conn.Close(); } return result; }
场景2:
给定的 columnmapping 与源或目标中的任意列均不匹配
结果:这个我查询得最久,额,就是列名和数据库不一致(列名的排列顺序无关)
场景3:
如果dt列的数据无法转成数据库对应字段类型(如数据库需要int,但是dt是String的【我】,这里就会出错),
这样子的话,dt的列也需要根据需要进行数据转换
#region changeColum if (changeColum != null && changeColum.Any()) { foreach (var item in changeColum) { bool hasChange = false; ArrayList dtList = new ArrayList(); //get data for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { if (dt.Columns[j].ColumnName == item.Key) { hasChange = true; dtList.Add(dt.Rows[i][j].ToString()); } } } if (hasChange) { //移除 try { dt.Columns.Remove(item.Key); } catch (Exception ex) { } switch (item.Value) { case 0: //新增 dt.Columns.Add(item.Key, typeof(Int32)); break; case 1: //新增 dt.Columns.Add(item.Key, typeof(Decimal)); break; case 2: //新增 dt.Columns.Add(item.Key, typeof(DateTime)); break; default: dt.Columns.Add(item.Key, typeof(String)); break; } //get changeCol int changeCol = 0; for (int j = 0; j < dt.Columns.Count; j++) { if (dt.Columns[j].ColumnName == item.Key) { changeCol = j; break; } } //赋值 for (int i = 0; i < dtList.Count; i++) { switch (item.Value) { case 0: //赋值 int d = 0; Int32.TryParse(dtList[i].ToString(), out d); dt.Rows[i][changeCol] = d; break; case 1: //赋值 decimal d1 = 0; Decimal.TryParse(dtList[i].ToString(), out d1); dt.Rows[i][changeCol] = d1; break; case 2: //赋值 DateTime d2; DateTime.TryParse(dtList[i].ToString(), out d2); dt.Rows[i][changeCol] = d2; break; default: dt.Rows[i][changeCol] = dtList[i].ToString(); break; } } } } } #endregion
注:这里可以使用SQL Server Profieler 进行跟踪,但是发现只有直接插入的才有可以查看的数据(异常的都是出现在还没组成sql语句执行前的我看不懂的)
感谢:https://bbs.csdn.net/topics/310091635/
https://blog.csdn.net/u010476739/article/details/123335909
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 聊一聊 C#线程池 的线程动态注入 (下)
· 如何做好技术经理
· Kafka 的“无锁哲学”:高效消息流动的背后
· 时间轮在 Netty , Kafka 中的设计与实现
· MySQL 优化利器 SHOW PROFILE 的实现原理
· 《HelloGitHub》第 105 期
· 一句话,我让 AI 帮我做了个 P 图网站!
· Solon v3.0.5 发布!(Spring 生态可以退休了吗?)
· 记一次 .NET某工业视觉软件 崩溃分析
· NetCore开源项目,适合新手学习
2020-05-22 查看SQLServer中各表的数据量以及占用空间大小
2017-05-22 (初级试水)MVC 使用 ADO.Net + 泛型 操作数据库