zoukankan      html  css  js  c++  java
  • ADO.NET大批量更新数据

    public static void SqlBulkUpdate()
    {
        DataTable dt = ExcelHelper.ImportExcelFile("d://User1.xls"); //将Excel中的数据导入到DataTable中 10000条数据(作为更新数据的数据源)
        DateTime begin = DateTime.Now;
        string connectionString = connStr;
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            SqlDataAdapter sd = new SqlDataAdapter();
      //这200条数据仅仅是作为模板使用(相当于一个临时表,到时候用来放置需要更新的数据)
            sd.SelectCommand = new SqlCommand("select top 200 Id,Name,Age,Email,Date from T_Test", conn);
            DataSet dataset = new DataSet();
            sd.Fill(dataset);
            Random r = new Random(1000);
            sd.UpdateCommand = new SqlCommand("Update T_Test set Name=@name,Age=@age,Email=@email,Date=@date where id=@id", conn);
            sd.UpdateCommand.Parameters.Add("@name", SqlDbType.Char, 100, "name");
            sd.UpdateCommand.Parameters.Add("@age", SqlDbType.Int, 8, "age");
            sd.UpdateCommand.Parameters.Add("@email", SqlDbType.VarChar, 100, "email");
            sd.UpdateCommand.Parameters.Add("@date", SqlDbType.VarChar, 100, "date");
            sd.UpdateCommand.Parameters.Add("@id", SqlDbType.VarChar, 100, "id");
            sd.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
            sd.UpdateBatchSize = 0;
           //真正进行更新的是这一段
            for (int count = 0; count < dt.Rows.Count-1;)
            {                  
                for (int i = 0; i < 200; i++, count++)
                {
                    if (count > dt.Rows.Count - 1) break;
                    dataset.Tables[0].Rows[i].BeginEdit(); //对 System.Data.DataRow 对象开始编辑操作。
                    dataset.Tables[0].Rows[i]["Name"] = dt.Rows[count][1];
                    dataset.Tables[0].Rows[i]["Age"] = dt.Rows[count][2];
                    dataset.Tables[0].Rows[i]["Email"] = dt.Rows[count][3];
                    dataset.Tables[0].Rows[i]["Date"] = dt.Rows[count][4];
                    dataset.Tables[0].Rows[i]["Id"] = dt.Rows[count][0];//必须要保证dt中的Id在数据表中存在,否则会报错,比如dt中的Id=1000,那么数据表中也需要有一条Id=1000的数据
                    dataset.Tables[0].Rows[i].EndEdit();//终止发生在该行的编辑。
                }
       //Update:为指定 System.Data.DataTable 中每个已插入、已更新或已删除的行调用相应的 INSERT、UPDATE 或 DELETE 语句。
                sd.Update(dataset.Tables[0]);
            }
            dataset.Tables[0].Clear();
            sd.Dispose();
            dataset.Dispose();
            conn.Close();
        }
        TimeSpan ts = DateTime.Now - begin;//更新一万条数据2秒左右
    }
    注意上面的更新操作是指在一个十万,百万,千万条记录中我要不断更新其中的记录,这些要更新的记录并不是从头
     
    到尾这样的顺序,只是不断地根据条件更新任何记录,我不可能把成百上千万记录先Fill到ds中然后在ds中Select到
     
    这条记录然后更新,所以每200次更新操作填入一次DataTable中提交,就实现了JDBC的addBat和executeBat操作.
    
    方案二、
    /// <summary>
    /// 批量更新
    /// </summary>
    /// <param name="dt">数据源</param>
    /// <param name="columns">columns是要插入的列表</param>
    /// <param name="tableName">tableName是要插入的表名</param>
    /// <returns></returns>
    public static bool MultUpdata(DataTable dt, string columns, string tableName)
    {
        using (SqlConnection conn = new SqlConnection(connStr))
        {
             //保证取一个空表
            string sql = string.Format("select {0} from {1} where id=0", columns, tableName);
            using (SqlCommand cmd = new SqlCommand(sql, conn))
            {
                try
                {
                    SqlDataAdapter adapter = new SqlDataAdapter();
                    adapter.SelectCommand = new SqlCommand(sql, conn);
                    SqlCommandBuilder scb = new SqlCommandBuilder(adapter);
                    scb.ConflictOption = ConflictOption.OverwriteChanges;
                    scb.SetAllValues = true;
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (dr.RowState == DataRowState.Unchanged)
                        {
                            dr.SetModified();
                        }
                        adapter.Update(dt);
                        dt.AcceptChanges();
                        adapter.Dispose();
                    }
                }
                catch (System.Data.SqlClient.SqlException e)
                {
                    conn.Close();
                    return false;
                }
            }
        }
        return true;
    }
    注意:数据集行的状态RowState必须是Modified状态,不是的话需要设置一下,还有就是更新的数据集中必须包含主键,没有的话就会报错。
    
    重要的一点就是data.AcceptChanges();这句代码,如果注释掉的话,虽然myDataAdapter.Update(data);这段代码更新了,但是数据库那边还是不行的。
  • 相关阅读:
    【1093 Ghajini 线段树】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) K A short problem】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) C Asteroids】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) E Little Elephant and Sorting】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) F A Mame】
    【hdu 1022 (简单栈题目),,狂敲代码】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) B Modular Inverse】
    【hdu 1069 Monkey and Banana(动态规划,被坑死。一遍AC)】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) D Little Elephant and Rozdil】
    【ECJTU_ACM 11级队员2012年暑假训练赛(8) H Petya and Strings】
  • 原文地址:https://www.cnblogs.com/nayilvyangguang/p/9981547.html
Copyright © 2011-2022 走看看