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 [email protected],[email protected],[email protected],[email protected] where [email protected]", 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);这段代码更新了,但是数据库那边还是不行的。

原文地址:https://www.cnblogs.com/nayilvyangguang/p/9981547.html

时间: 2024-10-08 22:50:15

ADO.NET大批量更新数据的相关文章

IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决

SQLBulkCopy是继承SQLClient空间下的一个特殊类,它可以帮助我们以映射的方式把DataTable和DataReader数据大批量导入到数据库对应表中 public void Inert2DBBySqlBulkCopy(DataTable data, string tableName) { BaseDao basdd = new BaseDao(); using (SqlConnection conn = new SqlConnection(basdd.SqlNormMap.Dat

ADO.NET程序访问数据的组件

组成--数据集(内存中的数据库) --DataSet数据集 --DataTable数据表 --DataColumn数据列 --DataRow数据行 --DataView数据视图--NET数据提供程序 --Connection连接(程序和数据库之间的桥梁) --Open/Close --ConnectionString:连接字符串(目标数据库的信息) --服务器:server / data source --用户名:uid / user id --密码:pwd / password --数据库:d

hibernate批量删除和更新数据

转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器,在Hibernate的配置文件里,hibernate.query.factory_class属性用来选择查询翻译器. (1)选择Hibernate3.0的查询翻译器: hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTrans

MySQL大批量插入数据

MySQL大批量插入数据 1. 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据. ALTER  TABLE  tblname  DISABLE  KEYS; loading  the  data ALTER  TABLE  tblname  ENABLE  KEYS; 这两个命令用来打开或者关闭Myisam表非唯一索引的更新.在导入大量的数据到一 个非空的Myisam表时,通过设置这两个命令,可以提高导入的效率.对于导入大量 数据到一个空的Myisam表,默认就是先导入数据然后才

ADO.NET 中的数据并发

当多个用户试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响.处理这种情况的系统叫做“并发控制”.并发控制的类型通常,管理数据库中的并发有三种常见的方法: ?保守式并发控制 - 在从获取记录直到记录在数据库中更新的这段时间内,该行对用户不可用. ?开放式并发控制 - 只有当实际更新数据时,该行才对其他用户不可用.更新将在数据库中检查该行并确定是否进行了任何更改.如果试图更新已更改的记录,则将导致并发冲突. ?最后的更新生效 - 只有当实际更新数据

mybatis学习之路----批量更新数据两种方法效率对比

原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql:

thinkphp 的save()不能更新数据解决办法

用save()方法始终更新不了数据,又不显示明确的错误信息,找了好久才在手册里看到一句至关重要的话: 为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录. 因此在使用create自动更新数据时,要在表单添加一个隐藏域,其值为数据表的id值! thinkphp 的save()不能更新数据解决办法,布布扣,bubuko.com

Django开发运维后台(二):建立模型与更新数据

上一篇文章我已经新建了一个SaAdmin的APP,现在开始在这APP下面来code 1.修改setting.py的数据库连接: DATABASES = {     'default': {         'ENGINE':'django.db.backends.mysql',         'NAME': 'QjshAdmin',         'USER': 'root',         'PASSWORD': 'lihuipeng',         'HOST': 'localho

经验总结16--EF局部更新数据

EF提供更新某个实体的某些数据,而其他数据保留的功能. 1.重新实例一个实体,并给予ID和需要修改的字段.注:此处的实体不能从数据库中查询,只能新的实例. Order order = new Order() { ID = id }; order.Name= "test222"; 2.包含该实体,更新策略为Unchanged,设置需要更新的字段. DbEntityEntry<Order> entry = db.Entry<Order>(order); entry.