ADO.NET大批量更新数据

ADO.NET大批量进行数据更新 

重要的参考资料 http://bbs.csdn.net/topics/370090507

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; count++)
        {                  
            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操作.


例子2

/// <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);这段代码更新了,但是数据库那边还是不行的,我的理解是这样:Adapter本身是适配器的意思,适配器是连接两个物体之间的桥梁,就像协议一样,两边都通过才可以完成整个过程。data.AcceptChanges();的意思是应用数据集的更改,我测试过在数据集传输之前应用更新,也是可以更新到数据库的,可能就是dr.SetModified();这段代码在控制吧,如果数据库中的数据在数据集中发生变化,就会生成相应的Uodate,执行更新,这些都是我的猜测,底层的东西我不是很了解,这也是我欠缺的地方,等项目上线完一定要恶补下。

批量更新我应用的场景是:datagridview绑定查询的数据,对数据进行修改,然后批量更新到数据库。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值