以下是关于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; }
企业数字化 ERP 产品动态
相关推荐
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 软件架构解析 后端前端企业应用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 从原理到实战 人工智能语音音频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落地实战:确定性与智能的工业融合方法论 /* 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编程助手插件安全风险与防护指南 1. 从"零点击"说起:Plugin4Shell 到底在讲一件什么事先把结论摆在前面:Plugin4Shell 不是一个具体的软件产品,而是一类针对 AI 编程助手插件体系的漏洞利用思路的统称。它的核心特征在于"零点击"——也就是说,… · 2026/9/25 5:56:03
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
创维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 /* 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