zoukankan      html  css  js  c++  java
  • SqlBulkCopy批量写入25万条数据只需3s

    Microsoft SQL Server 提供一个称为 bcp 的流行的命令提示符实用工具,用于将数据从一个表移动到另一个表(表既可以在同一个服务器上,也可以在不同服务器上)。SqlBulkCopy 类允许编写提供类似功能的托管代码解决方案。还有其他将数据加载到 SQL Server 表的方法(例如 INSERT 语句),但相比之下SqlBulkCopy 提供明显的性能优势。

    使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据。

    下面介绍下Demo(批量写入258114条数号码归属地数据)

                //打开选择文档对话框
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "文本类型|*.txt|文本类型|*.csv";//限定打开类型
                if (ofd.ShowDialog() == false)
                {
                    return;
                }
                string fileName = ofd.FileName;
                string[] lines = File.ReadAllLines(fileName, Encoding.Default).ToArray();//打开文本,使用指定的格式编码读出所有行,然后关闭
                //GetTableCoulmn(lines);
                #region 原始代码
                int s = System.Environment.TickCount;//记录函数执行开始时间
                DataTable table = new DataTable();
                //建立列名和导入的文件中的列名对应
                table.Columns.Add(new DataColumn("StartNum"));
                table.Columns.Add(new DataColumn("TelTypes"));
                table.Columns.Add(new DataColumn("City"));
                table.Columns.Add(new DataColumn("TelCode"));
                for (int i = 0; i < lines.Length; i++)
                {
                    //插入行数据
                    string[] strs = lines[i].Split('	');//字符串分割
                    DataRow row = table.NewRow();
                    row["StartNum"] = strs[0];
                    row["TelTypes"] = strs[2].ToString().Trim('"');//消除两边字符
                    row["City"] = strs[1].ToString().Trim('"');
                    row["TelCode"] = strs[3].ToString().Trim('"');
                    table.Rows.Add(row);
                }
    
                string connstr = ConfigurationManager.ConnectionStrings["cnnstr"].ConnectionString;
                using (SqlConnection cnn = new SqlConnection(connstr))
                {
                    cnn.Open();
                    SqlBulkCopy copy = new SqlBulkCopy(cnn);
                    copy.DestinationTableName = "TelephoneFull";//插入目标表数据
                    copy.ColumnMappings.Add("StartNum", "StartNum");//列名、数据库表字段
                    copy.ColumnMappings.Add("TelTypes", "TelTypes");
                    copy.ColumnMappings.Add("City", "TelArea");
                    copy.ColumnMappings.Add("TelCode", "TelCode");
                    copy.WriteToServer(table);
                }
                int j = System.Environment.TickCount;//记录函数执行结束时间
                MessageBox.Show("成功写入" + lines.Count() + "条数据,耗时" + (j - s) + "ms");
                #endregion

    测试后显示

    上述

    定义 SqlBulkCopy 实例的数据源中的列与该实例的目标表中的列之间的映射。 

    如果数据源和目标表具有相同的列数,并且数据源中每个源列的序号位置匹配相应目标列的序号位置,则无需 ColumnMappings 集合。但是如果列计数不同,或序号位置不一致,则必须使用 ColumnMappings,以确保将数据复制到正确的列中。

  • 相关阅读:
    凯撒密文的破解编程实现
    微软ping命令的源代码
    从编程到入侵
    永远的后门
    永远的后门
    奇妙的Base64编码
    用端口截听实现隐藏嗅探与攻击(二)
    奇妙的Base64编码
    Liferea 1.1.2
    Equinox Desktop Environment 1.1
  • 原文地址:https://www.cnblogs.com/tuqun/p/3637691.html
Copyright © 2011-2022 走看看