C# 数据库批量插入数据之 —— SqlBulkCopy、表值参数
创建了一个用来测试的Student表: CREATE TABLE [dbo].[Student]( [ID] [int] PRIMARY KEY NOT NULL, [Num] [varchar](10) NULL, [Name] [nvarchar](64) NULL, [Age] [int] NULL ) 一、SqlBulkCopy类 使用数据库BCP协议进行数据的批量复制,每一批的数量大约800条。 /// <summary> /// 批量插入Sqlsbc /// </summary> /// <param name="dt"></param> /// <param name="tableName">表名</param> public static void BatchInsertBySqlsbc(DataTable dt, string tableName) { using (SqlBulkCopy sbc = new SqlBulkCopy(connString)) { sbc.BatchSize = dt.Rows.Count; //分批提交记录数,可不设 sbc.sbcTimeout = 10; //超时时间设置 sbc.DestinationTableName = tableName; // 设置目标表名称 // 列名映射 格式:ColumnMappings.Add("源数据列", "目标表对应列名称"); for (int i = 0; i < dt.Columns.Count; i++) { sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, i); } //也可以像下面这样进行映射 //sbc.ColumnMappings.Add("ID", "ID"); //sbc.ColumnMappings.Add("Num", "Num"); //sbc.ColumnMappings.Add("Name", "Name"); //sbc.ColumnMappings.Add("Age", "Age"); sbc.WriteToServer(dt); //全部写入数据库 } } //5万条数据插入花了2秒的时间
二、表值参数
也叫表变量参数,使用用户定义的表类型来声明,简单理解就是可以把一个表当做参数传递。
CREATE TYPE [dbo].[mytb_student] AS TABLE( [ID] [int] NOT NULL, [Num] [varchar](10) NULL, [Name] [nvarchar](64) NULL, [Age] [int] NULL )
/// <summary> /// 批量插入使用表值参数 /// </summary> /// <param name="dt"></param> public static void BatchInsertByTableValue(DataTable dt, string sqlText) { using (SqlConnection sqlConn = new SqlConnection(connString)) { using (SqlCommand sqlCmd = new SqlCommand(sqlText, sqlConn)) { //把DataTable当做参数传入 SqlParameter sqlPar = sqlCmd.Parameters.AddWithValue("@dt", dt); //指定表值参数中包含的构造数据的特殊数据类型。 sqlPar.SqlDbType = SqlDbType.Structured; sqlPar.TypeName = "dbo.mytb_student";//表值参数名称 sqlConn.Open(); sqlCmd.ExecuteNonQuery(); } } }
同样插入5万条数据,也是花了2秒的时间。
static void Main(string[] args) { Console.WriteLine("开始时间:"+DateTime.Now); DataTable dt=GetDataTable(); Console.WriteLine("插入数量:"+dt.Rows.Count+"条"); string sqlText=@"insert into Student(ID,Num,Name,Age) select t.ID,t.Num,t.Name,t.Age from @dt as t"; SqlHelper.BatchInsertByTableValue(dt,sqlText); Console.WriteLine("结束时间:"+DateTime.Now); Console.ReadKey(); }
总结:SqlServer数据库批量插入除了使用SqlBulkCopy和表值参数,还可以使用SqlDataAdapter的Update方法,经过本人测试,在数据量越大的情况下,使用SqlBulkCopy的性能是最好的。
分类:
Sql Server
, C#.Net & MVC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架