大数据快速的上传SQL数据库
大家好!今天分享测试小程序,感兴趣的可以看看。
我现在有104万条数据,需要添加到数据库中,我想问问大家,应该怎么插入?需要多长时间?
按我之前的做法,一条一条添加不就行了!但是时间呢需要多少?估计要1个小时以上,这个主要是说明一条一条添加大数据太慢了。
那么下面看看我的测试小程序:
首先数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | --***************指向当前要使用的数据库 use master go ----判断当前数据库是否存在 if exists ( select * from sysdatabases where name = 'test' ) drop database test --删除数据库 go --创建数据库 create database test on primary ( --数据库文件的逻辑名 name = 'test_data' , --数据库物理文件名(绝对路径) filename= 'D:\DB\test_data.mdf' , --数据库文件初始大小 size =2048MB, --数据文件增长量 filegrowth=512MB ) --创建日志文件 log on ( name = 'test_log' , filename= 'D:\DB\test_log.ldf' , size =2048MB, filegrowth=512MB ) go --*****管理表*******指向当前要使用的数据库 use test go --创建表 if exists( select * from sysobjects where name = 'TableB' ) drop table TableB go create table TableB ( value1 varchar (50) not null , -- 一个值 value2 varchar (50) not null , -- 一个值 ) go ----添加测试数据 insert into TableB(value1,value2) values ( 'funiyi_01' , 'funiyi_11' ) insert into TableB(value1,value2) values ( 'funiyi_21' , 'funiyi_21' ) ------查询表里面的数据 select * from TableB go |
这个是程序的主页面:
部分C#程序代码展示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /// <summary> /// txt文件生成 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_txt_Click( object sender, EventArgs e) { dataNum = 720000; System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); timer.Start(); StringBuilder sb = new StringBuilder(); try { for ( int i = 0; i < dataNum; i++) { sb.Append(i.ToString() + ',' + i.ToString() + '\n' ); //数据列用逗号分割,数据行用换行符分割 } //new一个有全路径的 流写入对象, StreamWriter streamWriter = new StreamWriter(Application.StartupPath + $ "\\{dataNum}.txt" , false ); streamWriter.Write(sb); //把文本字符串,通过流的方式写入 txt中 streamWriter.Close(); //关闭流写入对象 } catch (Exception) { throw ; } finally { sb = null ; GC.Collect(); } timer.Stop(); this .label2.Text = $ "txt添加{dataNum}条数据时间:" + timer.ElapsedMilliseconds.ToString() + "ms" ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /// <summary> /// txt BulkInsert /// txt文件大数据 保存SQL数据库 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void S_Click( object sender, EventArgs e) { dataNum =720000; System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); timer.Start(); //****************************数据表+++++++文件路径 ++++++++++++++++++++++++++++++++++++++++ 字段终止符 ++++++++++++行终止符 +++++++++++ 批量大小 string sqlBI = "BULK INSERT TableB FROM '" + Application.StartupPath + "\\" + dataNum + ".txt' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR='\n',BATCHSIZE =720000)" ; int iNum = SQLHelperAdvance.ExecuteNonQuery(sqlBI); //传送720000,iNum=1440000; timer.Stop(); this .label2.Text = $ "txt SQL添加{dataNum}条数据时间:" + timer.ElapsedMilliseconds.ToString() + "ms" ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /// <summary> /// 基本 Insert Into /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void bt_InsertInto_Click( object sender, EventArgs e) { System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); timer.Start(); sql = GetSql(); int iNum = SQLHelperAdvance.ExecuteNonQuery(sql); timer.Stop(); this .label2.Text = $ "SQL添加{dataNum}条数据时间:" + timer.ElapsedMilliseconds.ToString() + "ms" ; } /// <summary> /// 获取SQL执行字符串 /// </summary> /// <returns></returns> private string GetSql() { dataNum = 140000; sb = new StringBuilder(); try { for ( int i = 0; i < dataNum; i++) { sb.Append( "insert into TableB(value1,value2) values('" + i + "','" + i + "')" ); } return sb.ToString(); } catch (Exception) { throw ; } finally { sb = null ; GC.Collect(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /// <summary> /// 搜寻txt /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lab_search_Click( object sender, EventArgs e) { string [] files = Directory.GetFiles(Application.StartupPath, "*.TXT" ); //文件全路径列表 textBox1.Text = "找到txt文件:" + files.Length + "\r\n" ; foreach ( string file in files) { textBox1.Text += Path.GetFileName(file) + "\r\n" ; //new DirectoryInfo(@"c:\1").GetFiles("*.txt").ToList().ForEach(fi => fi.MoveTo(@"c:\2\" + fi.Name)); //移动文件 //++++++++++++++获取指定路径下的 txt文件全路径,转List,++++++++ List中的每个元素执行操作,把每个txt文件,剪切到另一个文件夹中 new DirectoryInfo(Application.StartupPath).GetFiles( "*.txt" ).ToList().ForEach(fi => fi.MoveTo( "D:\\data\\" + fi.Name)); } } private void btn_txtDe_Click( object sender, EventArgs e) { string path = Environment.CurrentDirectory; string pattern = "*.txt" ; string [] strFileName = Directory.GetFiles(path, pattern); foreach ( var item in strFileName) { File.Delete(item); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private ExcelReport report; /// <summary> /// 直接创建,不需要模板 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_ExcelSheetNew_Click( object sender, EventArgs e) { report = new ExcelReport(); //report.CreateWorksheet(01.ToString()); for ( int i = 20; i >= 1; i--) { report.CreateWorksheet( "段号" + i.ToString()); //注意:最后创建的表索引是1,老的表索引依次加大 } report.Show(); //显示对象 report.ChangeCurrentWorkSheet(1); //改变当前的工作表,如果选择的表不存在,就使用之前的 report.WriteTextToReport(1, 1, "funiyi816+1" ); report.ChangeCurrentWorkSheet(2); //改变当前的工作表,如果选择的表不存在,就使用之前的 report.WriteTextToReport(1, 1, "funiyi816+2" ); report.SaveAs(Application.StartupPath + "\\001" , ExcelSaveFormat.xlsx); report.Close(); //关闭对象 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /// <summary> /// 通过模板打开 单个表格 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_ExcelSingleSheet_Click( object sender, EventArgs e) { dataNum = 720000; //(新版本2007之后)最大行1048576,XFD (老版本97-2003)最大行65536,IV List<TableB> tableBList = new List<TableB>(); for ( int i = 0; i < dataNum; i++) { tableBList.Add( new TableB() { Value1 = i.ToString(), Value2 = i.ToString() }); } System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); timer.Start(); report = new ExcelReport(Application.StartupPath + "\\Template\\Template.xlsx" ); //创建对象 report.ChangeCurrentWorkSheet(1); //改变当前的工作表,如果选择的表不存在,就使用之前的 report.Show(); //显示对象 report.WriteListToReport(2, 1, tableBList, true ); report.SaveAs(Application.StartupPath + $ "\\{dataNum}" , ExcelSaveFormat.xlsx); //保存文件 report.Close(); //关闭对象 timer.Stop(); this .label2.Text = $ "EXCEL添加{dataNum}条数据时间:" + timer.ElapsedMilliseconds.ToString() + "ms" ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /// <summary> /// 多个表格 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_ExcelMultipleSheet_Click( object sender, EventArgs e) { dataNum = 720000; //(新版本2007之后)最大行1048576,XFD (老版本97-2003)最大行65536,IV List<TableB> tableBList = new List<TableB>(); for ( int i = 0; i < dataNum; i++) { tableBList.Add( new TableB() { Value1 = i.ToString(), Value2 = i.ToString() }); } System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); timer.Start(); //string str = Application.StartupPath + "\\Template\\Template.xlsx"; report = new ExcelReport(Application.StartupPath + "\\Template\\Template.xlsx" ); //创建对象 report.ChangeCurrentWorkSheet(1); //改变当前的工作表 report.Show(); //显示对象 report.WriteListToReport(2, 1, tableBList, true ); report.ChangeCurrentWorkSheet(2); //改变当前的工作表 report.WriteListToReport(2, 1, tableBList, true ); report.ChangeCurrentWorkSheet(3); //改变当前的工作表 report.WriteListToReport(2, 1, tableBList, true ); report.SaveAs(Application.StartupPath + $ "\\{dataNum}" , ExcelSaveFormat.xlsx); //保存文件 report.Close(); //关闭对象 timer.Stop(); this .label2.Text = $ "EXCEL添加{dataNum}条数据时间:" + timer.ElapsedMilliseconds.ToString() + "ms" ; } |
好的,就分享到这来吧,又要上班了。欢迎大家进入我们的群一起交流,学习
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决