大数据快速的上传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";
}

 

 好的,就分享到这来吧,又要上班了。欢迎大家进入我们的群一起交流,学习

 

posted @   funiyi816  阅读(210)  评论(0编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示