zoukankan      html  css  js  c++  java
  • [转]SQLBulkCopy使用

    SQLBulkCopy,用于数据库之间大批量的数据传递。通常用于新,旧数据库之间数据的更新。即使表结构完全不同,也可以通过字段间的对应关系,顺利的将数据导过来。

    首先,SQLBulkCopy需要2个连接。分别连接到不同的旧表所在的数据库,新表所在的数据库。如果是同一个数据库,就可以用同一个SqlConnection对象。

    其次,我们要从旧数据库中,把导出的字段读取出来。用什么读呢?可以用Datatable,也可以用SqlDataReader。因为SqlDataReader不占用内存,对大批量的数据复制,不需要事先导入到系统。所以就用SqlDataReader了。

    读出后,设定对应关系,设定目标表名,写入。就这么简单。速度非常快!

            SqlConnection ConnectionNew = new SqlConnection("连接信息");
    
            SqlConnection ConnectionOld = new SqlConnection("连接信息");
    
            //激发的方法写在外头
            private void bulkCopy_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
            {
                /*
                执行的内容。
                这里有2个元素值得拿来用
                e.RowsCopied,返回数值类型,表示当前已经复制的行数
                e.Abort,用于赋值true or false,用于停止赋值的操作 
                */
            }
    
            public void bulkCopy()
            {
                try
                {
                    //1.在旧表中,用SqlDataReader读取出信息
                    SqlCommand cmd = new SqlCommand(SQL, ConnectionOld);
                    sdr = cmd.ExecuteReader();
    
                    //2.初始化SqlBulkCopy对象,用新的连接作为参数。
                    SqlBulkCopy bulkCopy = new SqlBulkCopy(ConnectionNew);
    
                    //3.写对应关系。如旧表的People列的数据,对应新表Human列,那么就写bulkCopy.ColumnMappings.Add("People","Human")
                    //如果两张表的结构一样,那么对应关系就不用写了。
                    //我是用哈希表存储对应关系的,哈希表作为参数到传入方法中,key的值用来存储旧表的字段名,VALUE的值用来存储新表的值
                    foreach (string str in HTDuiYing.Keys)
                    {
                        bulkCopy.ColumnMappings.Add(str, HTDuiYing[str].ToString());
                    }
                    //4.设置目标表名
                    bulkCopy.DestinationTableName = TableNmae;
                    //额外,可不写:设置一次性处理的行数。这个行数处理完后,会激发SqlRowsCopied()方法。默认为1
                    bulkCopy.NotifyAfter = 10;
                    //额外,可不写:设置激发的SqlRowsCopied()方法,这里为bulkCopy_SqlRowsCopied
                    bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
                    //OK,开始传数据!
                    bulkCopy.WriteToServer(sdr);
                }
                catch { }
            }
    

      

    也可以直接使用DataTable填充:

            private DateTime startTime;
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                startTime = DateTime.Now;
                string srcConnString = "";
                string desConnString = "";
                SqlConnection srcConnection = new SqlConnection();
                SqlConnection desConnection = new SqlConnection();
                SqlCommand sqlcmd = new SqlCommand();
                SqlDataAdapter da = new SqlDataAdapter();
                DataTable dt = new DataTable();
                //srcConnString = ConfigurationManager.ConnectionStrings["srcDBConnection"].ConnectionString;
                desConnString = ConfigurationManager.ConnectionStrings["desDBConnection"].ToString();
                //srcConnection.ConnectionString = srcConnString;
                srcConnection.ConnectionString = desConnString;
                sqlcmd.Connection = srcConnection;
                //sqlcmd.CommandText = "select * from jobs";
                sqlcmd.CommandText = "select * from abc";
                sqlcmd.CommandType = CommandType.Text;
                sqlcmd.Connection.Open();
                da.SelectCommand = sqlcmd;
                da.Fill(dt);
    
                SqlBulkCopy sbc = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.UseInternalTransaction);
                sbc.BulkCopyTimeout = 5000;
                sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnRowsCopied);
                sbc.NotifyAfter = dt.Rows.Count;
    
                try
                {
                    // sbc.DestinationTableName = "jobs";
                    sbc.DestinationTableName = "bcd";
                    sbc.WriteToServer(dt);
                }
                catch (Exception ex)
                {
                    lblCounter.Text = ex.Message.ToString();
                }
                finally
                {
                    sqlcmd.Clone();
                    srcConnection.Close();
                    desConnection.Close();
    
                }
    
            }
            private void OnRowsCopied(object sender, SqlRowsCopiedEventArgs args)
            {
                lblCounter.Text += args.RowsCopied.ToString() + " rows are copied<Br>";
                TimeSpan copyTime = DateTime.Now - startTime;
                lblCounter.Text += "Copy Time:" + copyTime.Seconds.ToString() + "." + copyTime.Milliseconds.ToString() + " seconds";
            }
    

      

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/relax/p/3447011.html
Copyright © 2011-2022 走看看