之前写过一篇 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!"));

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

  1. MySQL插入重复数据

    MySQL中批量insert into时防止更新插入重复数据去重的方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法 方案一:使用ignore关键字 ...

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

    防止同一条数据完全重复: 一.主关键字约束:主键约束.1.能够唯一的区分每一行数据.——不许重2.表中的数据按照主键字排序的.——有序3.主键字不能为空——不为空4.一个表只能有一个主键,但可以设置组 ...

  3. SqlBulkCopy实现大容量数据快速插入数据库中

    一般情况下,我们手写sqlhelper类,在此类中定义一个数据插入到数据库的一个方法.将数据库连接密封在using()的语句中.using显示了Idispose接口.可以及时释放数据库连接资源.代码如 ...

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

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

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

    错误提示:ORA-00001: 违反唯一约束条件 (ABPPMGR.C0248833319_6192)ORA-06512: 在 "STG.FP_MO_SPLIT", line 19 ...

  6. Mysql 删除数据表重复行

    准备示例数据 以下sql创建表,并将示例数据插入到用于演示的contacts表中. CREATE TABLE contacts ( id INT PRIMARY KEY AUTO_INCREMENT, ...

  7. List 集合中数据不重复的使用

    foreach (DataRow dr in dt.Rows) { list.Add(dr["项目组"].ToString()); } list = list.Distinct&l ...

  8. 使用Linq判断DataTable数据是否重复

    我们一般系统在导入数据的时候,一般都是通过NPOI将excel数据转换成DataTable,然后将DataTable导入到数据库.在数据导入的过程中,其实很重要的一部就是检查DataTable中的数据 ...

  9. Python操作MySQL数据库,插入重复数据

    sql = "INSERT  INTO test_c(id,name,sex)values(%s,%s,%s)" param = (1,'AJ','MAN') n = cursor ...

随机推荐

  1. SVM的使用

    注意:数据结构的一致性,在高维度数据一般使用rbf核函数,使用网格搜索思想迭代求出gamma和c. 每行为一个样本,数据类型都围绕标黄代码而定义的. SVM训练如下坐标(左边一列为A类,右边为B类), ...

  2. 【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ

    题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表 ...

  3. JS原生编写实现留言板功能

    实现这个留言板功能比较简单,所以先上效果图: 实现用户留言内容,留言具体时间. <script> window.onload = function(){ var oMessageBox = ...

  4. Outer()函数

    转载:https://bbs.pinggu.org/thread-7078237-1-1.html R语言中的outer()函数,名为内积函数,但是他执行的功能并不是解析几何中的内积.那该函数到底发挥 ...

  5. JQuery--jQuery对象与DOM对象

    1.JQuery是继Prototype之后又一个优秀的JavaScript库: 2.Jquery的理念是“写得少,做得多”,它有如下优势: --1)轻量级:2)强大的选择器:3)出色的DOM操作的封装 ...

  6. php 等于不等于 一个感叹号两个等于号

    $a == $b 等于 TRUE,如果 $a 等于 $b. $a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同.(PHP 4 引进) $a != $b 不等 TRUE,如 ...

  7. Jmeter插件解释

    Jmeter插件解释 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表)  2.jp@gc - AutoStop Listener :自动停止监听 ...

  8. 2-10 就业课(2.0)-oozie:2、介绍和安装1

    oozie的安装及使用 1.  oozie的介绍 Oozie是运行在hadoop平台上的一种工作流调度引擎,它可以用来调度与管理hadoop任务,如,MapReduce.Pig等.那么,对于Oozie ...

  9. springCloud 之 Eureka服务治理

    服务治理是微服务架构中最核心和基础的模块 首先我们创建一个springCloud eureka service的springboot 工程,该工程提供一个服务中心,用来注册服务,第二个工程是clien ...

  10. RTL8711AM

    官方文档主要修改 为了实现log服务 1,在log_service.h 取消注释 #ifndef LOG_SERVICE_H #define LOG_SERVICE_H #include " ...