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

 

posted @   蜗牛的礼物  阅读(168)  评论(0编辑  收藏  举报
编辑推荐:
· 聊一聊 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 + 泛型 操作数据库
点击右上角即可分享
微信分享提示