【SQL】解决 SQLServer SqlBulkCopy 重复问题

解决 SQLServer SqlBulkCopy 重复问题

目前程序需要使用到大量的数据存储,导入的数据量每次均为在800-2000之间,并且每条数据需要从接口处获取其他信息并组合成一条完整的数据,耗时,占用大量内存,因此使用该方法能尽快的减少等待时间跟准确率。

先上我的逻辑:

  • 数据集先从数据库当中获取,若是相同的数据则只调用一次接口方法获取数据,循环将数据填充完成,得到一份DataTable 数据集
  • 可使用SqlBulkCopy 方法快速的将数据进行保存到数据库当中
  • 但由于无法判断数据的重复性,并且不想做循环浪费时间的操作去校验数据的内容,因此需要使用SQLServer MERGE 方法进行操作
  • 这个方法写在存储过程当中,起到同步的作用,效果实在棒。

上代码:
C# :

public void InsertTable(DataTable dt, string TabelName, DataColumnCollection dtColum)
{
               
    //声明数据库连接
    SqlConnection conn = new SqlConnection(SysConfiguration.GetConnectionString());
    conn.Open
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要避免在使用SqlBulkCopy插入数据时出现重复数据,可以考虑以下两种方法: 1. 在插入之前先检查是否存在重复数据,如果存在则不进行插入。可以通过在目标表中设置唯一性约束或者创建临时表并在其中进行检查来实现。 2. 在SqlBulkCopy的WriteToServer方法中使用SqlBulkCopyOptions中的KeepIdentity选项,以保留目标表中已有的自增长主,从而避免插入重复的自增长主。 以下是使用第一种方法的示例代码: ```csharp using System.Data.SqlClient; using System.Data; //创建一个DataTable对象,用于存储要插入的数据 DataTable dt = new DataTable(); //添加列 dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); //添加数据 dt.Rows.Add("John", 25); dt.Rows.Add("Mike", 30); //创建连接对象 SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Integrated Security=True;"); //打开连接 conn.Open(); //创建事务对象 SqlTransaction tran = conn.BeginTransaction(); try { //创建SqlBulkCopy对象 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tran)) { //设置目标表名 bulkCopy.DestinationTableName = "Person"; //设置列映射 bulkCopy.ColumnMappings.Add("Name", "Name"); bulkCopy.ColumnMappings.Add("Age", "Age"); //使用SqlBulkCopyOptions中的CheckConstraints选项检查唯一性约束 bulkCopy.WriteToServer(dt, SqlBulkCopyOptions.CheckConstraints); } //提交事务 tran.Commit(); } catch (Exception ex) { //回滚事务 tran.Rollback(); throw ex; } finally { //关闭连接 conn.Close(); } ``` 使用第二种方法时,只需要在SqlBulkCopy的构造函数中指定KeepIdentity选项即可: ```csharp using System.Data.SqlClient; using System.Data; //创建一个DataTable对象,用于存储要插入的数据 DataTable dt = new DataTable(); //添加列 dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); //添加数据 dt.Rows.Add("John", 25); dt.Rows.Add("Mike", 30); //创建连接对象 SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Integrated Security=True;"); //打开连接 conn.Open(); //创建事务对象 SqlTransaction tran = conn.BeginTransaction(); try { //创建SqlBulkCopy对象,并设置KeepIdentity选项 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, tran)) { //设置目标表名 bulkCopy.DestinationTableName = "Person"; //设置列映射 bulkCopy.ColumnMappings.Add("Name", "Name"); bulkCopy.ColumnMappings.Add("Age", "Age"); bulkCopy.WriteToServer(dt); } //提交事务 tran.Commit(); } catch (Exception ex) { //回滚事务 tran.Rollback(); throw ex; } finally { //关闭连接 conn.Close(); } ``` 以上示例代码仅供参考,实际应用中需要根据具体情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值