C# SqlBulkCopy 避免插入重复数据(不重复即插入)

之前写过一篇 C# SqlBulkCopy 大量数据导入到数据库 的文章介绍了大量数据导入到数据库的高效方法。

这篇文章与之有些关联,在这之前所想的是做全量插入,每次run这个job就会清空然后插入,但是面对大量的数据,每次产生的流量是很大的,尤其是数据来自一些付费的API时,无疑增大了很多开销。所以我们只获取7天内更新的数据然后再选择未插入的数据插入到表中,对表作增量操作,由此达到控制成本的目的。

在此之前看过多篇博客都介绍了解决这个问题的方法,用到了一些零时表和触发器的知识,本人对此不胜了解,项目也比较紧,未研究,遂放弃,在此介绍一个相对简单的方法。

介绍其他人的正规解决方案一例,SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入),有兴趣的可以研究下

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

想法:

我们将获取到的需要插入的数据先存放到一个临时表A_tem中(这个临时表是我每次执行就创建,结尾删除的表)

  表A              表A_tem        

    

创建一个存储过程

select * from A_tem  except select * from A

由此得到需要插入的在表A中不存在的数据

  result

-------------------------------------------------------------------------------------------

Code Sample:

                    string connString = ConfigurationManager.ConnectionStrings["connString"].ToString();
                    SqlConnection conn = new SqlConnection(connString);
                    conn.Open();
                    Logger.LogMessage(string.Format("Createing Temporary table CsvFileVCQData_Tem......"));

                    //Creater Temporary Table
                    string sql = "CREATE TABLE CsvFileVCQData_Tem( [StringFormatted] [nvarchar](max) NULL, [ProjectName] [nvarchar](256) NULL, [ResID_MD4Hash] [nvarchar](max) NULL, [Wordcount] [numeric](18, 0) NULL, [CharacterCount] [numeric](18, 0) NULL, [SentanceCount] [numeric](18, 0) NULL, [SingleWord] [bit] NULL, [TwoWordsOnly] [bit] NULL, [HasPunctuation] [bit] NULL,[ContainsProductName] [bit]NULL, [HasPlaceholder] [bit] NULL, [EndsInColon] [bit]  NULL, [HasVCQ] [bit] NULL,[HasDevComment] [bit] NULL, [HasLocComment] [bit] NULL,[HasScreenshot] [bit] NULL,[IsMobile] [bit] NULL,[IsDesktop] [bit] NULL,[IsWeb] [bit] NULL,[IsConsumer] [bit] NULL,[IsBusiness] [bit] NULL,[TotalSteelheadResults] [nvarchar](256) NULL,[SteelheadPasses] [numeric](18, 0) NULL,[SteelheadFailures] [numeric](18, 0) NULL, [S_Pass_Over_Total] [nvarchar](256) NULL, [S_Failed_Over_Total] [nvarchar](256) NULL,[ScoredLabels] [bit] NULL,[ScoredProbabilities] [nvarchar](256) NULL) ON[PRIMARY] TEXTIMAGE_ON[PRIMARY]";
                    Execute_Sql(sql);

                    SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(conn);
                    sqlbulkcopy.DestinationTableName = "CsvFileVCQData_Tem";
                    //sqlbulkcopy.DestinationTableName = itemTable.TableName;//数据库中的表名
                    sqlbulkcopy.BulkCopyTimeout = 300;

                    Logger.LogMessage(string.Format("Finding " + itemTable.Rows.Count + " pieces of data"));
                    Logger.LogMessage(string.Format("Importing into the temporary table......"));

                    DataTable datNew = itemTable.DefaultView.ToTable(false, new string[] {
                        "StringFormatted","ProjectName","ResID_MD4Hash","Wordcount","CharacterCount",
                        "SentanceCount","SingleWord","TwoWordsOnly","HasPunctuation","ContainsProductName",
                        "HasPlaceholder","EndsInColon","HasVCQ","HasDevComment","HasLocComment",
                        "HasScreenshot","IsMobile","IsDesktop","IsWeb",
                        "IsConsumer","IsBusiness","Total Steelhead Results","SteelheadPasses","SteelheadFailures",
                        "S_Pass_Over_Total","S_Failed_Over_Total","Scored Labels","Scored Probabilities"
                    });
                    sqlbulkcopy.WriteToServer(datNew);

                    DbHelper DBH = new DbHelper();
                    DataTable result = DBH.ExecuteDataTable("get_NewData");//调用存储过程

                    Logger.LogMessage(string.Format("Finding "+result.Rows.Count+" pieces of new data......"));

                    sqlbulkcopy.DestinationTableName = "CsvFileVCQData";
                    sqlbulkcopy.WriteToServer(result);

                    Logger.LogMessage(string.Format("Droping temporary table CsvFileVCQData_Tem......"));

                    string sql_ = "drop table CsvFileVCQData_Tem";
                    Execute_Sql(sql_);
                    conn.Close();
                    Logger.LogMessage(string.Format("Operation Done!"));

原文地址:https://www.cnblogs.com/yangsirc/p/8676367.html

时间: 2024-10-16 08:46:26

C# SqlBulkCopy 避免插入重复数据(不重复即插入)的相关文章

SQL多个主键的表,插入数据有重复时,查询数据的重复值?

SQL多个主键的表,插入数据有重复时,会提示违反主键约束不能插入的错误.那么,如何找到插入数据的重复值? 解决方法:使用group by 假设有个表#a,有saleid,vendorid,comid,price,saleprice,quantity等字段. 主键是:saleid,vendorid,comid三个.假设插入#a的数据源可能会有重复的. 即:saleid,vendorid,comid三个字段都一样的字段,那么插入#a的时候会报主键冲突,违反主键约束. 如果想找出#a表中插入重复的值可

在数据库并发情况下避免插入重复数据的一个解决方法

目前公司的项目中碰到一个情况:需要向一个数据表table1中插入记录,该表的结构类似于下面的定义: 列名  类型 是否允许为空 Id int no Area string no AreaIndex int no Name string no 其中Name的值由Area和AreaIndex拼接而成,形式类似于“Area+AreaIndex”.对于相同的Area,AreaIndex从1开始计数,所以对于Area分别为“AA”,“BB”,“CC”的情况,Name的值类似下面这样: AA001 AA00

集合的概念及应用和HashSet保证数据不重复的原理

集合的概念:集合类存放的都是对象的引用,不是对象本身,我们称集合中的对象就是指集合中对象的引用(reference),存放在Java.util包中. 集合类型主要有3种:set(集).list(列表)和map(映射). 集合的特点是:可以改变长度,但不保证迭代顺序和不存放重复的数据 在集合中如何判断两个数据相等? 在集合中判断一个数据是否相等要根据它的HashCode方法和equlas方法来判断内容是否相等,我们在判断一个数据是否相等的时候,首先它会调用自己的HashSet方法计算出一个Code

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

在asp.net 2.0中使用SqlBulkCopy类迁移数据

在asp.net 2.0中使用SqlBulkCopy类迁移数据 (转) http://jackyrong.cnblogs.com/archive/2005/08/29/225521.html 我们经常要在一个表中将数据迁移到另一个表,当然,用的方法十分多了.在.net 2.0中,提供了一个sqlbulkcopy类,也可以实现如下的操作,下面简单介绍下.比如一个表如下CREATE TABLE Person3( PersonID int IDENTITY(1,1) PRIMARY KEY, Name

SQL数据库约束行为---防止数据完全重复

防止同一条数据完全重复: 一.主关键字约束:主键约束.1.能够唯一的区分每一行数据.——不许重2.表中的数据按照主键字排序的.——有序3.主键字不能为空——不为空4.一个表只能有一个主键,但可以设置组合主键.操作:在表的设计界面(在要加主键的表上面鼠标右键选择设计,如下图),在相应的列上,右击-"设为主键"/"删除主键".或点击左上角钥匙图标 代码实现: create table car1( code varchar(50) primary key, name va

删除数据表里重复出现的记录

删除数据表里重复出现的记录例子:    有一个数据表classes,有字段id,class,数据表里出现了多个班级名字一样的记录,现在要删除重复出现的记录.先查询数据表里重复出现的记录:    SELECT id FROM classes GROUP BY class然后再删除查询出来的重复数据:    DELETE FROM classes WHERE id in(SELECT id FROM classes GROUP BY class)抛出错误:    [SQL]DELETE FROM c

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问题 [CSDN博客] mysql 主从复制 双主从复制原理 防止主键重复问题(必看) [CSDN博客] replace into导致mysql自增列导致主键重复问题分析 [CSDN博客] 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql) [CSDN博客] mysql i

MO拆分计划行程序中写入PRODUCTIONORDERS表数据出现重复导致报错(BUG)20180502

错误提示:ORA-00001: 违反唯一约束条件 (ABPPMGR.C0248833319_6192)ORA-06512: 在 "STG.FP_MO_SPLIT", line 199  ORA-06512: 在 "STG.FP_MO_SPLIT", line 1318 错误描述:MO拆分计划行程序中写入PRODUCTIONORDERS表数据出现重复导致报错(BUG) 存储过程:FP_MO_SPLIT 解决方法: 原文地址:https://www.cnblogs.co