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实现,非常在意性能的慎用