ADO.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 = 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"); //获取要更新的DataTable
bool value = 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)批量更新(或插入)数据

待续

 

转载于:https://www.cnblogs.com/tracine0513/p/4037608.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值