使用SqlBulkCopy将datatable数据批量导入sqlServer

该博客介绍了如何在ASP.NET环境中使用SqlBulkCopy类将接收到的逗号分隔的ID集合转换为DataTable,并进一步批量导入到指定的SQL Server表中。通过Request.Params获取参数ids和db,将ids拆分为数组,然后创建DataTable并填充数据,最后调用ExecuteTransactionScopeInsert方法执行批量导入操作。
#region 使用SqlBulkCopy批量插入数据
        //参数dt,数据源datatable
        //参数tableName,目标sqlserver数据表名称
        public  void ExecuteTransactionScopeInsert(DataTable dt, string tableName)
        {
            int count = dt.Rows.Count;
            int copyTimeout = 600;
            bool flag = false;
            try
            {
                using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString))
                {
                    using (TransactionScope scope = new TransactionScope())
                    {
                        cn.Open();
                        using (SqlBulkCopy sbc = new SqlBulkCopy(cn))
                        {
                            //服务器上目标表的名称   
                            sbc.DestinationTableName = tableName;
                            sbc.BatchSize = dt.Rows.Count;
                            sbc.BulkCopyTimeout = copyTimeout;
                            for (int i = 0; i < dt.Columns.Count; i++)
                            {
                                //列映射定义数据源中的列和目标表中的列之间的关系   
                                sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName);
                            }
                            sbc.WriteToServer(dt);
                            flag = true;
                            scope.Complete();//有效的事务   
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }


        }
        #endregion


        #region 初始化datatable,以便其结构与sqlserver数据表结构相同,这个初始化函数根据每个数据表的不同需要重写,没什么通用性
        public DataTable GetTableSchema()
        {
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[]{
            new DataColumn("oldid",typeof(int)),       
       new DataColumn("db",typeof(string))});
            return dt;
        }

        #endregion


           protected void Page_Load(object sender, EventArgs e)
        {            
            string ids = Request.Params["ids"] == null ? "" : Request.Params["ids"].ToString();//id的集合,id之间用逗号分隔,如“1,2,3,4”
            string db = Request.Params["db"] == null ? "" : Request.Params["db"].ToString();//目标sqlserver数据表的名称
            if (ids != "" & db != "")
            {
                string[] sArray = ids.Split(',');
                DataTable dt = GetTableSchema(); //初始化datatable

                //遍历id集合,将每个id作为一条记录添加到datatable

                foreach (string i in sArray)

                {
                        DataRow r = dt.NewRow();
                        r[0] = i.ToString();
                        r[1] = db;
                        dt.Rows.Add(r);
                }
                ExecuteTransactionScopeInsert(dt, "sqlServerTableName");//将datatable导入到sql server
            }
        }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值