首页/新闻资讯/正文详情

通过SqlBulkCopy类实现高效批量插入

发布时间:2026/9/25 5:28:35 来源:云帆数科 栏目:资讯中心
通过SqlBulkCopy类实现高效批量插入
以下是关于C#中BulkSqlHelper用法的综合说明‌基础封装方法‌通过SqlBulkCopy类实现高效批量插入典型封装包含连接字符串管理、事务支持和错误处理需引用System.Data.SqlClient命名空间‌核心实现步骤public class BulkSqlHelper { private SqlConnection conn; public BulkSqlHelper(SqlConnection con) { this.conn con; } public static void BulkInsertT(SqlConnection conn, string tableName, IListT list) { try { using (var bulkCopy new SqlBulkCopy(conn)) { bulkCopy.BatchSize list.Count; bulkCopy.DestinationTableName tableName; //bulkCopy.NotifyAfter 500000; //bulkCopy.BulkCopyTimeout 600000; var table new DataTable(); var props TypeDescriptor.GetProperties(typeof(T)) .CastPropertyDescriptor() .Where(propertyInfo propertyInfo.PropertyType.Namespace.Equals(System)) .ToArray(); props props.Where(p p.Name ! ID).ToArray(); foreach (var propertyInfo in props) { if (propertyInfo.Name ID) continue; bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name); table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType); } var values new object[props.Length]; foreach (var item in list) { for (var i 0; i values.Length; i) { values[i] props[i].GetValue(item); } table.Rows.Add(values); } bulkCopy.WriteToServer(table); } } catch (Exception e) { } } public static void BulkInsertGuidT(SqlConnection conn, string tableName, IListT list) { try { using (var bulkCopy new SqlBulkCopy(conn)) { bulkCopy.BatchSize list.Count; bulkCopy.DestinationTableName tableName; var table new DataTable(); var props TypeDescriptor.GetProperties(typeof(T)) .CastPropertyDescriptor() .Where(propertyInfo propertyInfo.PropertyType.Namespace.Equals(System)) .ToArray(); //props props.Where(p p.Name ! ID).ToArray(); foreach (var propertyInfo in props) { // if (propertyInfo.Name ID) continue; bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name); table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType); } var values new object[props.Length]; foreach (var item in list) { for (var i 0; i values.Length; i) { values[i] props[i].GetValue(item); } table.Rows.Add(values); } bulkCopy.WriteToServer(table); } } catch (Exception e) { } } public static string BulkInsertDataTable(SqlConnection conn, DataTable table, string sqlTableName) { try { using (var bulkCopy new SqlBulkCopy(conn)) { if (table.Rows.Count 50000) { bulkCopy.BatchSize table.Rows.Count; } else { bulkCopy.BatchSize 50000; } //bulkCopy.BulkCopyTimeout 3600; bulkCopy.DestinationTableName sqlTableName; for (int i 0; i table.Columns.Count; i) { bulkCopy.ColumnMappings.Add(table.Columns[i].ColumnName, i1); } bulkCopy.WriteToServer(table); } return string.Empty; } catch (Exception e) { return $sqlbulk写入表【{sqlTableName}】错误 e; } } }具体调用if (db.Database.Connection.State ! ConnectionState.Open) { db.Database.Connection.Open(); //打开Connection连接 } BulkSqlHelper.BulkInsert((SqlConnection)db.Database.Connection, tableName,listModel; BulkSqlHelper.BulkInsertGuidModel((SqlConnection)db.Database.Connection,tableName,listModel); BulkSqlHelper.BulkInsertDataTable((SqlConnection)db.Database.Connection, DataTable, tableName); if (db.Database.Connection.State ! ConnectionState.Closed) { db.Database.Connection.Close(); //关闭Connection连接 } //其中BulkSqlHelper.BulkInsertDataTable 中数据组合如下 DataTable dt new DataTable(); AddColumnsmodel(dt); foreach (var item in list) { dt.Rows.Add(GetTableInfo(item)); } private void AddColumnsT(DataTable table) { var props TypeDescriptor.GetProperties(typeof(T)) .CastPropertyDescriptor() .Where(propertyInfo propertyInfo.PropertyType.Namespace.Equals(System)) .ToArray(); props props.Where(p p.Name ! ID).ToArray(); foreach (var propertyInfo in props) { if (propertyInfo.Name ID) continue; // bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name); table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType); } } private object[] GetTableInfoT(T item) { var props TypeDescriptor.GetProperties(typeof(T)).CastPropertyDescriptor().Where(propertyInfo propertyInfo.PropertyType.Namespace.Equals(System)).ToArray(); props props.Where(p p.Name ! ID).ToArray(); var values new object[props.Length]; for (var i 0; i values.Length; i) { values[i] props[i].GetValue(item); } return values; }

相关推荐

mikro-orm 原生 BigInt 主键实战指南:MySQL 与 PostgreSQL 下的 BigIntType 映射详解
mikro-orm 原生 BigInt 主键实战指南:MySQL 与 PostgreSQL 下的 BigIntType 映射详解

后端 【免费下载链接】mikro-orm TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases. 项目地址: https://gitcode.com/gh_mir… · 2026/9/25 5:28:35

IDURAR ERP/CRM 开源项目功能全景:基于 MERN 栈的免费开源 ERP 与 CRM 软件架构解析
IDURAR ERP/CRM 开源项目功能全景:基于 MERN 栈的免费开源 ERP 与 CRM 软件架构解析

后端前端企业应用CRM 【免费下载链接】idurar-erp-crm Free Open Source ERP CRM Software Accounting Invoicing | Node.Js React 项目地址: https://gitcode.com/gh_mirrors/id/idurar-erp-crm 点击查看 免费下载 导读 IDURAR 是一款基于现代 MERN 技术栈&#… · 2026/9/25 5:28:35

食品产业园招商服务值得信赖吗
食品产业园招商服务值得信赖吗

把握产业升级方向,锚定食品园区招商的时代使命 立足都市食品大健康发展趋势,回应产业升级的真实需求当前国内食品产业正处在从传统生产制造向研发创新、品牌升级、健康化转型的关键阶段,长三角作为国内食品产业资源集聚、创新活跃的核心区域&… · 2026/9/25 5:28:29

PaddleSpeech 的 Kaldi 兼容语音特征提取:python_kaldi_features 从原理到实战
PaddleSpeech 的 Kaldi 兼容语音特征提取:python_kaldi_features 从原理到实战

人工智能语音音频NLP媒体生成 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation … · 2026/9/25 5:56:03

AI PLC落地实战:确定性与智能的工业融合方法论
AI PLC落地实战:确定性与智能的工业融合方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:56:03

Plugin4Shell零点击漏洞:AI编程助手插件安全风险与防护指南
Plugin4Shell零点击漏洞:AI编程助手插件安全风险与防护指南

1. 从"零点击"说起:Plugin4Shell 到底在讲一件什么事先把结论摆在前面:Plugin4Shell 不是一个具体的软件产品,而是一类针对 AI 编程助手插件体系的漏洞利用思路的统称。它的核心特征在于"零点击"——也就是说&#xff0c… · 2026/9/25 5:56:03

AdminJS useModal Hook 实战指南:在管理后台中实现 Alert、Confirm 与自定义内容弹窗
AdminJS useModal Hook 实战指南:在管理后台中实现 Alert、Confirm 与自定义内容弹窗

后端低代码 【免费下载链接】adminjs AdminJS is an admin panel for apps written in node.js 项目地址: https://gitcode.com/gh_mirrors/ad/adminjs 点击查看 免费下载 导读 useModal 是 AdminJS 前端提供的一个 Redux 驱动的弹窗 Hook,它将 adminj… · 2026/9/25 5:55:57

SaFeRDialogues 实战指南:让对话模型优雅回应安全失败后的用户反馈
SaFeRDialogues 实战指南:让对话模型优雅回应安全失败后的用户反馈

NLP人工智能深度学习 【免费下载链接】ParlAI A framework for training and evaluating AI models on a variety of openly available dialogue datasets. 项目地址: https://gitcode.com/gh_mirrors/pa/ParlAI 点击查看 免费下载 SaFeRDialogues(Safe… · 2026/9/25 5:55:57

fast-colors computeAlphaBlend() 函数深度解析:FAST 中的 alpha 混合不透明化计算
fast-colors computeAlphaBlend() 函数深度解析:FAST 中的 alpha 混合不透明化计算

前端UI组件 【免费下载链接】fast The adaptive interface system for modern web experiences. 项目地址: https://gitcode.com/gh_mirrors/fa/fast 点击查看 免费下载 导读 computeAlphaBlend() 是 microsoft/fast-colors 颜色工具库中负责将两层半透明颜色&quo… · 2026/9/25 5:55:57

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码