C# 使用SqlBulkCopy类批量复制大数据

 

DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Age");
for (int i = 0; i < 80000; i++)
{

    DataRow row = dt.NewRow();

    row["Name"] = "aa" + i;

    row["Age"] = i * i;

    dt.Rows.Add(row);

}

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connstr))
{

    bulkCopy.DestinationTableName = "T_Persons";

    bulkCopy.ColumnMappings.Add("Name", "Name");

    bulkCopy.ColumnMappings.Add("Age", "Age");

    bulkCopy.WriteToServer(dt);

}

  

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.IO;
using System.Data;

namespace 手机号码归属地查询SQL
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection conn = SqlHelper.CreatConnection())
            using (SqlTransaction tx = conn.BeginTransaction())
            {
                try
                {
                    using (Stream fs = File.OpenRead(@"F:\如鹏网.Net训练营\Test\Net基础2\Test_ADONet_20150301\手机号码归属地查询SQL\导入资料\2014年7月份手机号码归属地数据库.csv"))
                    using (StreamReader reader = new StreamReader(fs, Encoding.Default))
                    {
                        reader.ReadLine();
                        string line;
                        DataTable dt = new DataTable();
                        dt.Columns.Add("MobileNumber");
                        dt.Columns.Add("MobileArea");
                        dt.Columns.Add("MobileType");
                        while ((line = reader.ReadLine()) != null)
                        {
                            if (string.IsNullOrEmpty(line))
                            {
                                break;
                            }

                            string[] lines = line.Split(',');
                            string MobileNumber = lines[1].Trim('"');
                            string MobileArea = lines[2].Trim('"');
                            string MobileType = lines[3].Trim('"');

                            DataRow row = dt.NewRow();
                            row["MobileNumber"] = MobileNumber;
                            row["MobileArea"] = MobileArea;
                            row["MobileType"] = MobileType;
                            dt.Rows.Add(row);
                        }

                        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, tx))
                        {
                            bulkCopy.DestinationTableName = "T_MobileAreas";
                            bulkCopy.ColumnMappings.Add("MobileNumber", "MobileNumber");
                            bulkCopy.ColumnMappings.Add("MobileArea", "MobileArea");
                            bulkCopy.ColumnMappings.Add("MobileType", "MobileType");
                            bulkCopy.WriteToServer(dt);
                        }
                        Console.WriteLine("成功导入 " + dt.Rows.Count + " 条数据");
                    }
                    tx.Commit();
                }
                catch (Exception ex)
                {
                    tx.Rollback();
                    Console.WriteLine("导入数据出错:"+ex);
                }
            }
            
            Console.ReadKey();
        }
    }
}

  

 

其他参考资料: 

 

殊途同归,ado.net快速实现MySql的CRUD

 

自用类库整理之SqlHelper和MySqlHelper

 

SqlHelper

  • ExecuteEmptyDataTable
    获取空表结构,主要用于需要构造DataTable进行大批量数据插入时使用
  • BulkInsert
    大批量数据插入,使用SqlBulkCopy进行大批量数据导入,仅提供了DataTable方式,需要DataReader的请自行重载
  • BatchUpdate
    批量数据更新、插入,使用SqlDataAdapter实现,需要进行较大数据量更新、插入时可以使用此方法,性能还不错
  • BatchUpdate,BatchDelete
    分批次批量删除、更新数据,此方法应用场景较少,用于需要删除、更新大量数据的同时不造成数据库阻塞且不影响数据库订阅、复制延时等
  • ExecutePageDataTable
    通用的分页方法,提供了CTE表达式的支持
  • SqlHelperExtension.cs(ExecuteObject、ExecuteObjects)
    提供了泛型获取对象方法支持,依赖依赖AutoMapper.dll实现,非常在意性能的慎用
  • SqlHelperSchemaExtension.cs
    SqlServer获取数据库、表、索引信息的封装,可以用来辅助写自己的代码生成器,查看数据库索引之类的

MySqlHelper

    • ExecuteEmptyDataTable
      获取空表结构,主要用于需要构造DataTable进行大批量数据插入时使用
    • BulkInsert
      使用MySqlBulkLoader进行大批量数据导入,仅提供了DataTable方式,需要DataReader的请自行重载
    • BatchUpdate
      批量数据更新、插入,使用MySqlDataAdapter实现,需要进行较大数据量更新、插入时可以使用此方法,性能还不错
    • MySqlHelperExtension.csExecuteObject、ExecuteObjects
      提供了泛型获取对象方法支持,依赖依赖AutoMapper.dll实现,非常在意性能的慎用

 

posted @ 2015-12-31 00:52  linyongqin  阅读(995)  评论(0编辑  收藏  举报