nbjjy 发表于 2013-9-2 21:59:30

C# SqlBulkCopy使用心得

方法一:
private void button1_Click(object sender, EventArgs e)
      {
            string constring = System.Configuration.ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
            string sql = "SELECT s_saledt,branch,f_execamt from cntpy order by branch";
            long sLocct = 0;
            DataTable dt = Common.SqlServerHelper.ExecuteTable(sql); //获取解析日志数据
            if (dt != null)
            {
                System.Diagnostics.Stopwatch sw01 = new System.Diagnostics.Stopwatch();
                sw01.Start();
                ExecuteSqlBulkCopy(dt, "cntpy_do", constring); //批量插入(本人一次插入20万,30万没有试过,有兴趣自己研究)
                sw01.Stop();
                sLocct = sw01.ElapsedMilliseconds; //这里是自己加的 用来记录插入数据所花时间
            }
            this.label1.Text = "用时:" + sLocct.ToString() + "秒";
      }
      public void ExecuteSqlBulkCopy(DataTable dt, string strTableName, string strConn)
      {
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                conn.Open();
                try
                {
                  SqlBulkCopy bulk = new SqlBulkCopy(conn);
                  bulk.DestinationTableName = strTableName;//表名
                  bulk.BatchSize = dt.Rows.Count;
                  bulk.BulkCopyTimeout = 180;
                  bulk.ColumnMappings.Add("s_saledt", "s_saledt"); //本地表和目标表列名
                  bulk.ColumnMappings.Add("branch", "branch");   //如果表有多个字段,下面继续添加
                  bulk.ColumnMappings.Add("f_execamt", "f_execamt");   //如果表有多个字段,下面继续添加
                  bulk.WriteToServer(dt);
                  bulk.Close();
                }
                catch (Exception ex)
                {
                  throw new Exception(ex.Message);
                }
                finally
                {
                  if (conn.State != ConnectionState.Closed) conn.Close();
                }
            }
      }

方法二:
private void Main_Load(object sender, EventArgs e)
      {
            string constring = System.Configuration.ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
            string sql = "SELECT s_saledt,f_execamt,branch from cntpy order by branch";
            DataTable dt = Common.SqlServerHelper.ExecuteTable(sql);
            this.dataGridView1.DataSource = dt;
      }
      private void button2_Click(object sender, EventArgs e)
      {
            if (this.dataGridView1.DataSource != null)
            {
                long sLocct = 0;
                System.Diagnostics.Stopwatch sw01 = new System.Diagnostics.Stopwatch();
                sw01.Start();
                for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                {
                  string cmdInsert = String.Empty;
                  cmdInsert = "insert into cntpy_do(s_saledt,f_execamt,branch)";
                  cmdInsert += "VALUES('" + this.dataGridView1.Rows.Cells.Value + "'";
                  cmdInsert += ",'" + this.dataGridView1.Rows.Cells.Value + "'";
                  cmdInsert += ",'" + this.dataGridView1.Rows.Cells.Value + "')";
                  Common.SqlServerHelper.ExecuteSql(cmdInsert);
                }
                sw01.Stop();
                sLocct = sw01.ElapsedMilliseconds;
                this.label1.Text = "用时:" + sLocct.ToString() + "秒";
            }
      }

第二种方法执行的太慢了没有第一种方法好用,但第二种可以自由变换数据.
比如:
private void button2_Click(object sender, EventArgs e)
      {
            if (this.dataGridView1.DataSource != null)
            {
                string str="百货集团";
                long sLocct = 0;
                System.Diagnostics.Stopwatch sw01 = new System.Diagnostics.Stopwatch();
                sw01.Start();
                for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                {
                  string cmdInsert = String.Empty;
                  cmdInsert = "insert into cntpy_do(s_saledt,f_execamt,branch)";
                  cmdInsert += "VALUES('" + this.dataGridView1.Rows.Cells.Value + "'";
                  cmdInsert += ",'" + this.dataGridView1.Rows.Cells.Value + "'";
                  cmdInsert += ",'" + str+ "')";
                  Common.SqlServerHelper.ExecuteSql(cmdInsert);
                }
                sw01.Stop();
                sLocct = sw01.ElapsedMilliseconds;
                this.label1.Text = "用时:" + sLocct.ToString() + "秒";
            }
      }

那这样第三列就是你想要得到的名称.

zhouhappy 发表于 2013-9-28 14:26:53

我用过,确实速度很快,那你知道怎样快速批量更新吗?

aolongxue 发表于 2013-9-30 11:41:23

很好的文章分享!!!
页: [1]
查看完整版本: C# SqlBulkCopy使用心得