日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# SqlBulkCopy数据批量入库

發布時間:2025/3/20 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# SqlBulkCopy数据批量入库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

準備條件:20萬+數據

界面設計使用的WPF。

沒有對比就沒有傷害,以下是我兩種方式導入數據案例。

運行 結果對比:

首先使用一般sql語句導入,因為時間原因,我就沒有等待程序執行完,但是我記錄了大約需要多少時間,以及執行了多少時間。
導入數據共計:258113條,執行了38秒,已經入庫了6971條,大約還需要1429秒。(不去考慮電腦配置,界面數據加載耗時等因素)

接下來我們看看同樣的數據量 SqlBulkCopy效果如何:

當我注釋代碼中使用異步操作,當然,界面會出現假死狀態。再來看看運行結果。

?

?

解析數據時間明顯減少。

?

以下是這個測試工具的全部代碼:

/// <summary>/// BatchImportForm.xaml 的交互邏輯/// </summary>public partial class BatchImportForm : Window{ private static readonly string ConnStr = ConfigurationManager.ConnectionStrings["myconnStr"].ConnectionString;public BatchImportForm(){InitializeComponent();}private void BtnQueryImport_Click(object sender, RoutedEventArgs e){var filePath = GetFilePath();if (!string.IsNullOrEmpty(filePath)){// 防止界面假死狀態Task task = Task.Factory.StartNew(() =>{SqlWork(filePath);});}}private string GetFilePath(){// 讀取文本文件OpenFileDialog ofd = new OpenFileDialog();ofd.InitialDirectory = System.Environment.CurrentDirectory+ "\\Resources\\Txt"; // @"C:\Users\WenDaoJun\Documents\Visual Studio 2015\Projects\JWell\JWell.Cloud.UI\Resources\Txt";ofd.Title = "讀取文件";ofd.FileName = "";ofd.RestoreDirectory = true;ofd.Filter = "所有文件(*.*)|*.*|文本文件(*.txt)|*.txt";ofd.ValidateNames = true;ofd.CheckFileExists = true;ofd.CheckPathExists = true;string strName = string.Empty;if (ofd.ShowDialog() == true){strName = ofd.FileName;}if (strName == ""){MessageBox.Show("沒有選擇文件!");return null;}return strName;}private void BtnQueryImportTwo_Click(object sender, RoutedEventArgs e){string filePath = GetFilePath();//if (!string.IsNullOrEmpty(filePath))//{// Task task = Task.Factory.StartNew(() =>// {// SqlBulkWord(filePath);// });//} SqlBulkWord(filePath);}/// <summary>/// 第一種方法/// </summary>/// <param name="fuillPath"></param>private void SqlWork(string fuillPath){var lines = File.ReadAllLines(fuillPath, Encoding.Default);// 異步給控件賦值this.Dispatcher.Invoke(() => { this.JingDuOn.Maximum = lines.Length; });this.Dispatcher.Invoke(() => { this.LblRuKuOne.Content = lines.Length; });using (SqlConnection conn = new SqlConnection(ConnStr)){conn.Open();var t1 = DateTime.Now;for (int i = 0; i < lines.Length; i++){// 拼接數據// 解析文本文件 "\"號段\"\t\"所屬地區\"\t\"號碼類型\"\t\"區號\"" var strs = lines[i].Split('\t');var telNumber = strs[0].Trim('"');var telArea = strs[1].Trim('"');var telType = strs[2].Trim('"');var telAreaCode = strs[3].Trim('"');// 入庫using (SqlCommand cmd = conn.CreateCommand()){cmd.CommandText = @"insert into TelNum(TelNumber,TelType,TelArea,TelAreaCode) values(@TelNumber,@TelType,@TelArea,@TelAreaCode)";cmd.Parameters.Add(new SqlParameter("@TelNumber", telNumber));cmd.Parameters.Add(new SqlParameter("@TelType", telArea));cmd.Parameters.Add(new SqlParameter("@TelArea", telType));cmd.Parameters.Add(new SqlParameter("@TelAreaCode", telAreaCode));cmd.ExecuteNonQuery();//異步委托 this.JingDuOn.Dispatcher.Invoke(() => { this.JingDuOn.Value += 1; });this.LblJinDuOne.Dispatcher.Invoke(() => { this.LblJinDuOne.Content = i; });}var t2 = DateTime.Now;var tsp = t2 - t1;// 異步給控件賦值this.LblHaoShiOne.Dispatcher.Invoke(() => { this.LblHaoShiOne.Content = tsp.TotalSeconds; });this.LblZongHaoShiOne.Dispatcher.Invoke(() => { this.LblZongHaoShiOne.Content = $"倒計時{(tsp.TotalSeconds * lines.Length / (i + 1))}秒完成。"; });}}}/// <summary>/// 第二種方法/// </summary>/// <param name="filePath"></param>private void SqlBulkWord(string filePath){var lines = File.ReadAllLines(filePath, Encoding.Default);this.Dispatcher.Invoke(() => { this.JingDuTwo.Maximum = lines.Length; });this.Dispatcher.Invoke(() => { this.LblRuKuTwo.Content = lines.Length; });var t1 = DateTime.Now;// 創建入庫需要的數據源 DataTableDataTable dt = new DataTable();dt.Columns.Add(new DataColumn("TelNumber", typeof(string)));dt.Columns.Add(new DataColumn("TelType", typeof(string)));dt.Columns.Add(new DataColumn("TelArea", typeof(string)));dt.Columns.Add(new DataColumn("TelAreaCode", typeof(string)));for (int i = 0; i < lines.Length; i++){var row = dt.NewRow();// 拼接數據// 解析文本文件 "\"號段\"\t\"所屬地區\"\t\"號碼類型\"\t\"區號\"" var strs = lines[i].Split('\t');row["TelNumber"] = strs[0].Trim('"');row["TelType"] = strs[1].Trim('"');row["TelArea"] = strs[2].Trim('"');row["TelAreaCode"] = strs[3].Trim('"');dt.Rows.Add(row);this.JingDuTwo.Dispatcher.Invoke(() => { this.JingDuTwo.Value += 1; });this.LblJinDuTwo.Dispatcher.Invoke(() => { this.LblJinDuTwo.Content = i; });}var t2 = DateTime.Now;var tsp = t2 - t1;this.LblHaoShiTwo.Dispatcher.Invoke(() => { this.LblHaoShiTwo.Content = tsp.TotalSeconds; });// 入庫計時var sw = new Stopwatch();sw.Start(); using (SqlBulkCopy sbk = new SqlBulkCopy(ConnStr)){//表名sbk.DestinationTableName = "TelNum";//DataTable中的列名和數據庫中列名對應sbk.ColumnMappings.Add("TelNumber", "TelNumber");sbk.ColumnMappings.Add("TelType", "TelType");sbk.ColumnMappings.Add("TelArea", "TelArea");sbk.ColumnMappings.Add("TelAreaCode", "TelAreaCode");sbk.WriteToServer(dt);}sw.Stop();this.LblZongHaoShiTwo.Dispatcher.Invoke(() => { this.LblZongHaoShiTwo.Content=sw.Elapsed.TotalSeconds; });}}

?

轉載于:https://www.cnblogs.com/wendj/p/9015018.html

總結

以上是生活随笔為你收集整理的C# SqlBulkCopy数据批量入库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。