首页 > 代码库 > .Net中批量更新数据(没有数据就添加)
.Net中批量更新数据(没有数据就添加)
方法一:使用SqlBulkCopy实现批量更新或添加数据。
SqlBulkCopy类一般只能用来将数据批量插入打数据库中,如果数据表中设置了主键,出现重复数据的话会报错,如果没有设置主键,那么将会添加同样的数据,导致数据重复。这里有两种方案可实行方案,实现批量将数据更新到数据表中。如果数据存在,就更新数据;如果不存在,则添加一条新的数据
这两种方案都需要添加一个新的用作临时存储数据的表,假如有两个表 BatchTableTemp和BatchTable, SqlBulkCopy类先批量将数据添加到BatchTableTemp中,然后再将BatchTable表中不存在的数据添加到BatchTable表中,存在的数据更新到BatchTable表中
方案一:在执行完SqlBulkCopy批量将数据添加到BatchTableTemp以后,执行存储过程,BatchTable表中不存在的数据就添加Insert,存在的数据更新Update
SqlHelper代码:
//<summary>//返回操作影响的行数//</summary>public static int ExcuteNonQuery( CommandType cmdType, string cmdText, SqlParameter[] cmdParms){ SqlCommand cmd = PrepareSqlCommand(cmdType, cmdText, cmdParms); int value =http://www.mamicode.com/ cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.Connection.Close(); return value;}/// <summary>/// 批量添加数据/// </summary>/// <param name="dt"></param>/// <returns></returns>public static bool ExcuteNonQuery(DataTable dt){ SqlConnection connection = new SqlConnection(connString); connection.Open(); SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connection); sqlbulkcopy.BulkCopyTimeout = 100; //超时之前操作完成所允许的秒数 sqlbulkcopy.BatchSize = dt.Rows.Count; //每一批次中的行数 sqlbulkcopy.DestinationTableName = dt.TableName; //服务器上目标表的名称 for (int i = 0; i < dt.Columns.Count; i++) { sqlbulkcopy.ColumnMappings.Add(i, i); //映射定义数据源中的列和目标表中的列之间的关系 } sqlbulkcopy.WriteToServer(dt); // 将DataTable数据上传到数据表中 connection.Close(); return true;}
C#执行ExcuteNonQuery(),批量添加到BatchTableTemp,然后在执行存储过程代码
DataTable table = GetDataTable("BatchTableTemp"); //获取要更新的DataTablebool value =http://www.mamicode.com/ SqlHelper.ExcuteNonQuery(table);if (value){ SqlHelper.ExcuteNonQuery(CommandType.StoredProcedure, "InsertOrUpdate", null);}
将BatchTableTemp同步更新到BatchTable表中的存储过程代码:
ALTER procedure [dbo].[InsertOrUpdate]as begin update BatchTable set BatchTable.Column1=BatchTableTemp.Column1, BatchTable.Column2=BatchTableTemp.Column2, BatchTable.Column3=BatchTableTemp.Column3, BatchTable.Column4=BatchTableTemp.Column4, BatchTable.Column5=BatchTableTemp.Column5 from BatchTable,BatchTableTemp where BatchTable.Gradation=BatchTableTemp.Gradation insert into BatchTable select * from BatchTableTemp where not exists (select Gradation from BatchTable where BatchTable.Gradation=BatchTableTemp.Gradation) delete BatchTableTemp end
方案二:待续
方法二:利用表值参数(简称TVPS)批量更新(或插入)数据
待续
.Net中批量更新数据(没有数据就添加)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。