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 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 避免插入重复数据(不重复即插入)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Markdown基础语法小结
- 下一篇: 洛谷 1608 路径统计