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秒左右
}
这条记录然后更新,所以每200次更新操作填入一次DataTable中提交,就实现了JDBC的addBat和executeBat操作.
例子2
///
/// 批量更新
///
/// 数据源
/// columns是要插入的列表
/// tableName是要插入的表名
///
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状态,不是的话需要设置一下,还有就是更新的数据集中必须包含主键,没有的话就会报错。