之前写过一篇 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 Tablestring 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

C# SqlBulkCopy 避免插入重复数据(不重复即插入)相关推荐

  1. oracle判断非空并拼接,oracle sql 判断字段非空,数据不重复,插入多跳数据

     oracle sql 判断字段非空,数据不重复 select distinct(mobile) from wx_user_mobile where active_time is not null ...

  2. oracle插入数据不重复,oracle插入数据重复

    版本号: 业务场景(如下): 后台自动执行的SQL插入数据,出现了重复数据,且无法稳定重现,偶然会遇见一次.场景为一组数据,如10条,依次插入数据库中.采取了循环生成sql拼接,先删后插的方式,最后统 ...

  3. mysql如何防止插入重复数据_如何防止MySQL重复插入数据,这篇文章会告诉你

    在MySQL进行数据插入操作时,总是会考虑是否会插入重复数据,之前的操作都是先根据主键或者唯一约束条件进行查询,有就进行更新没有就进行插入.代码反复效率低下. 新建表格 CREATETABLE`per ...

  4. android 过滤数组中的重复元素,Flutter List数组避免插入重复数据的实现

    List 具有一定长度存在索引的对象集合(长度为0不存在索引,长度>0存在索引) 常见列表 1.定长列表 默认值null 例如:List fixedLengthList = new List(2 ...

  5. mysql如何防止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  6. mysql 禁止插入重复数据_防止MySQL重复插入数据的三种方法

    新建表格 CREATE TABLE `person` ( `id` int NOT NULL COMMENT '主键', `name` varchar(64) CHARACTER SET utf8 C ...

  7. python覆盖数据库重复数据_Python操作MySQL数据库,插入重复数据

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

  8. bd2和mysql语法区别,经验:在MySQL数据库中,这4种方式可以避免重复的插入数据!...

    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下 ...

  9. 在MySQL数据库中,这4种方式可以避免重复的插入数据!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:小小猿爱嘻嘻 wukong.com/question/674 ...

最新文章

  1. 将窗体中名称为iremark_习题三新
  2. 「九章」量子计算优越性遭北大院士质疑,潘建伟陆朝阳长文回应
  3. Handler线程间通信
  4. linux软中断的实现
  5. 小型动漫知识图谱的构建 (Python+Neo4j) (纯实践内容,基于bilibili所有正版番剧的动漫、声优、角色、类型)
  6. 关于JWT的一些攻击方法
  7. leetcode动态规划(python与c++)
  8. Ajax返回值问题思考
  9. 二维数组的最大联通子数组和
  10. 原则读书法:书这么多,读完就忘怎么办
  11. Django下载服务器文件到本地
  12. Ffmpeg常用转码命令
  13. [原创]编程实现UCDOS字库的显示和打印
  14. Detours库Windows API Hook
  15. 《大学英语翻译》课程相关复习笔记
  16. 用C语言实现布丰投针计算圆周率问题
  17. 如何通过域名查询IP地址
  18. decorate装饰模式
  19. 终极 Shell——ZSH
  20. Android Studio 3.5.2版本安装流程

热门文章

  1. u盘安装linux18.04.3遇到的坑
  2. MySQL count(*)这么慢,我该怎么办?
  3. 苹果市值盘中超2万亿美元,从1万亿到2万亿仅用时2年
  4. 人工智能用哪个语言好 选择Python语言怎么样
  5. 七步带你认识计算机视觉
  6. 给嵌入式工程师的一封信
  7. linux源码编译安装lamp环境搭建,linux下源码包编译安装LAMP环境
  8. python括号生成_Python括号生成器的问题
  9. 002-layui颜色
  10. python supper_python supper()函数