C# .NET 8 SQL 批量插入 Dapper、BulkCopy 和表值参数

介绍

在 .NET 应用程序中处理大型数据集通常需要将数据高效地插入到 SQL Server 中。本文探讨了使用 C# 和 .NET 8 批量插入数据的三种流行技术:Dapper、SqlBulkCopy 和表值参数 (TVP)。我们将比较它们的性能、易用性和对不同场景的适用性。

1. Dapper Bulk Insert

Dapper 是一个轻量级 ORM(对象关系映射器),它在原始 SQL 和功能齐全的 ORM(如 Entity Framework)之间实现了平衡。虽然 Dapper 本身不支持批量插入,但可以对其进行扩展以高效执行批量插入。

执行

要使用 Dapper 进行批量插入,通常在单个事务中执行多个插入语句。以下是示例。

using Dapper;
using System.Data.SqlClient;
using System.Collections.Generic;public async Task BulkInsertDapperAsync(IEnumerable<MyData> data, string connectionString)
{using (var connection = new SqlConnection(connectionString)){await connection.OpenAsync();using (var transaction = connection.BeginTransaction()){string sql = "INSERT INTO MyTable (Column1, Column2) VALUES (@Column1, @Column2)";await connection.ExecuteAsync(sql, data, transaction: transaction);transaction.Commit();}}
}

2. SqlBulkCopy

SqlBulkCopy 是一个内置的 .NET 类,专门用于将批量数据传输到 SQL Server。它提供了这里讨论的三种方法中最快的性能,因为它直接写入数据库。

执行

以下是使用 SqlBulkCopy 的方法。

using System.Data;
using System.Data.SqlClient;public async Task BulkInsertSqlBulkCopyAsync(DataTable dataTable, string connectionString)
{using (var connection = new SqlConnection(connectionString)){await connection.OpenAsync();using (var bulkCopy = new SqlBulkCopy(connection)){bulkCopy.DestinationTableName = "MyTable";await bulkCopy.WriteToServerAsync(dataTable);}}
}

要使用 SqlBulkCopy,您需要将数据转换为 DataTable 或使用 IDataReader。

3. 表值参数 (TVP)

TVP 允许您将表作为参数传递给存储过程或 SQL 命令。它们提供了一种灵活而高效的方式来执行批量插入,尤其是当您需要在服务器端验证或操作数据时。

执行

首先,在 SQL Server 中定义一个用户定义表类型。

CREATE TYPE MyDataType AS TABLE
(Column1 INT,Column2 NVARCHAR(50)
);

接下来,创建一个存储过程来处理插入。

CREATE PROCEDURE InsertMyData@MyData MyDataType READONLY
AS
BEGININSERT INTO MyTable (Column1, Column2)SELECT Column1, Column2 FROM @MyData;
END

最后,实现使用 TVP 的 C# 代码。

using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Threading.Tasks;public async Task BulkInsertTVPAsync(IEnumerable<MyData> data, string connectionString)
{var dataTable = new DataTable();dataTable.Columns.Add("Column1", typeof(int));dataTable.Columns.Add("Column2", typeof(string));foreach (var item in data){dataTable.Rows.Add(item.Column1, item.Column2);}using (var connection = new SqlConnection(connectionString)){await connection.OpenAsync();using (var command = new SqlCommand("InsertMyData", connection)){command.CommandType = CommandType.StoredProcedure;var tvpParameter = command.Parameters.AddWithValue("@MyData", dataTable);tvpParameter.SqlDbType = SqlDbType.Structured;await command.ExecuteNonQueryAsync();}}
}

性能比较

每种方法的性能可能因数据集大小和应用程序的具体要求而异。一般来说。

  • SqlBulkCopy 是原始批量数据插入最快、最有效的方法。
  • TVP 提供了灵活性,并且对于需要服务器端数据验证或操作的场景非常有效。
  • Dapper 易于使用,并且能够与现有的基于 Dapper 的项目集成,但对于非常大的数据集,它可能不如 SqlBulkCopy 或 TVP 那么快。

结论

选择正确的方法将数据批量插入 SQL Server 取决于您的具体需求。

  • 使用 SqlBulkCopy 可获得原始数据传输的最高性能。
  • 当您需要灵活性和服务器端处理时,请使用表值参数。
  • 为了简单起见,请在以 Dapper 为中心的代码库中工作时使用 Dapper。

通过了解每种方法的优势和用例,您可以做出明智的决定来优化 .NET 应用程序的性能和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论Lambda架构及其应用

摘要&#xff1a; 2023年3月&#xff0c;我公司承担了本市教育局智慧教育云平台的项目&#xff0c;该平台旨在为教育机构和学生提供一个在线学习与教学的环境&#xff0c;包含课程管理、在线学习、资源共享、互动交流等功能。在项目中我担任系统架构师&#xff0c;全面负责项目…

实在RPA的硬件交互功能:U盾机械臂组件

一、为什么需要U盾机械臂&#xff1f; 在使用银行U盾&#xff08;USB Key&#xff09;进行操作时&#xff0c;涉及到许多手动确认步骤&#xff0c;特别是按下U盾上的确认按键。这种手动操作是自动化过程中的一个瓶颈。为了实现完全自动化&#xff0c;需要一种方法来自动按下U…

代码随想录算法训练营:17/60

非科班学习算法day17 | LeetCode654:最大二叉树 &#xff0c;Leetcode617:合并二叉树 &#xff0c;Leetcode700:二叉搜索树中的搜索&#xff0c;Leetcode98&#xff1a;验证二叉搜索树 目录 介绍 一、基础概念补充&#xff1a; 1.二叉搜索树 二、LeetCode题目 1.LeetCode…

价格!六安市各地双软(软件企业、软件产品)办理流程步骤及申报材料、时间

六安市各地双软&#xff08;软件企业、软件产品&#xff09;办理流程步骤材料 &#xff08;更多问题详情可以查看小编主页方式&#xff09; 第一步&#xff1a;办理软件企业认定 1.打开办理软件企业认定的中心网站&#xff0c;然后注册并登录&#xff0c;下载双软认定申报表…

大数据系统软件助力工业数字化转型

随着科技的不断进步&#xff0c;大数据系统软件在工业领域的应用日益广泛&#xff0c;成为推动工业数字化转型的关键技术之一。工业数字化转型旨在通过技术手段提升生产效率、优化资源配置&#xff0c;并提供智能决策支持&#xff0c;从而实现更高效、可持续的生产模式。 数据采…

Kafka 集群如何处理生产者和消费者处理消息速率差异问题?

kafka 集群如何处理生产者和消费者处理消息速率差异问题? Kafka 集群通过多种机制来处理生产者和消费者处理消息速率的差异问题,确保消息的高效传递和系统的 稳定性。以下是详细的解释和机制: 1. 消息缓冲机制 Kafka 使用消息缓冲机制来处理生产者和消费者速率的不匹配。…

接口测试中遇到的sessionID验证问题

在接口测试中&#xff0c;经常会存在联调的接口&#xff0c;比如登录完去调用其他的接口&#xff0c;这时就会存在一个问题&#xff0c;那就是登录成功了&#xff0c;但是其他接口失败了&#xff0c;这个时候就需要用到一个sessionID去传入其他接口验证合法性请求&#xff0c;这…

k8s重启后报错Error getting node not found

今天升级一台3主的k8s集群的配置。升级其中一台后另外两个节点就出现Not Ready的状态。 升级之前最好把一些能停的应用停掉。或者能够通过增加临时节点来进行扩容&#xff0c;不然所有pod调度到其他节点&#xff0c;可能把其他节点压垮。没办法&#xff0c;只能把其他两台直接…

Python学习前简介

1.python简介 2.python特点 3.python解释器 4.pyCharm简介 一、python简介 Python是一种高级编程语言&#xff0c;用于多种应用&#xff0c;包括网站开发、数据科学、人工智能、机器学习、桌面应用、网络应用、软件开发、网络爬虫等。它由Guido van Rossum于1991年首次发布&am…

group by和select的兼容性问题

group by和select的兼容性问题 在标准的SQL语法中&#xff0c;GROUP BY 和 SELECT 之间不存在兼容性问题&#xff0c;因为它们是 SQL 查询语句的基本组成部分&#xff0c;而且它们的使用方式是相互兼容的。 SELECT 子句和 GROUP BY 子句的关系&#xff1a; SELECT 子句&#…

Matlab进阶绘图第61期—滑珠散点图

滑珠散点图也是一种在《Nature》中常见的数据图。 其功能类似于柱状图&#xff0c;但更加简洁易读。 由于Matlab中没有现成的函数绘制滑珠散点图&#xff0c;因此需要大家自行解决。 本文利用自己制作的BubbleScatter工具&#xff0c;进行滑珠散点图的绘制&#xff0c;先来看…

【山东大学项目实训】进度汇报16

进行了带有历史记录的问答链的修改优化 Chat_QA_chain_self from langchain.chains import ConversationalRetrievalChain from qa_chain.model_to_llm import model_to_llm from qa_chain.get_vectordb import get_vectordbclass Chat_QA_chain_self:"""&quo…

ServBay[中文] 下一代Web开发环境

ServBay是一个集成式、图形化的本地化Web开发环境。开发者通过ServBay几分钟就能部署一个本地化的开发环境。解决了Web开发者&#xff08;比如PHP、Nodejs&#xff09;、测试工程师、小型团队安装和维护开发测试环境的问题&#xff0c;同时可以快速的进行环境的升级以及维护。S…

头歌Python作业——8.1 模拟生成身份信息及查验身份(project)

目录 第1关 第2关 第3关 第4关 第1关 import random def person_name(gender_of_id, last_name_file, male_name_file, female_name_file):"""参数 gender_of_id&#xff1a;性别&#xff0c;字符串类型参数 last_name_file&#xff1a;百家姓文件名&…

Chrome开发者工具学习

打开开发者工具&#xff1a; 可以通过在网页上点击右键并选择“检查”来打开。 或者使用快捷键Ctrl Shift I&#xff08;在Windows/Linux上&#xff09;或Command Option I&#xff08;在Mac上&#xff09;。 界面概览&#xff1a; 熟悉DevTools的基本面板&#xff0c;如“…

【精品案例】数字孪生技术与数字工厂案例(59页PPT)

引言&#xff1a;随着工业4.0和智能制造的快速发展&#xff0c;数字孪生技术和数字工厂已成为制造业转型升级的重要趋势。数字孪生技术通过构建虚拟的数字模型&#xff0c;实现对物理实体全生命周期的映射与仿真&#xff0c;为企业的产品研发、设计、制造等提供有力支持。而数字…

【AI大模型应用开发】3. RAG初探 - 动手实现一个最简单的RAG应用

0. 什么是RAG 大模型也不是万能的&#xff0c;也有局限性。 LLM 的知识不是实时的LLM 可能不知道你私有的领域/业务知识 RAG&#xff08;Retrieval Augmented Generation&#xff09;顾名思义&#xff1a;通过检索的方法来增强生成模型的能力。你可以把这个过程想象成开卷考…

MATLAB算法实战应用案例精讲-【数模应用】线性判别分析(附MATLAB、python和R语言代码实现)

目录 前言 算法原理 什么是判别分析 线性判别分析(LDA) 数学模型 二分类 多分类LDA ​编辑 算法思想: 费歇(FISHER)判别思想 贝叶斯(BAYES)判别思想 LDA算法流程 LDA与PCA对比 SPSSPRO 1、作用 2、输入输出描述 3、案例示例 4、案例数据 5、案例操作 …

VC++开发积累——vc++6.0中删除函数的方法,右键,Delete

目录 引出插曲&#xff1a;删除函数的方法多行注释的实现代码输入的自动提示搜索出来&#xff0c;标记和取消标记跳转到上一步的位置 ctrl TAB 总结其他规范和帮助文档创建第一个Qt程序对象树概念信号signal槽slot自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自…

SQL中limit用法记录

在SQL中&#xff0c;LIMIT 子句主要用于限制SELECT语句返回的结果集中的行数。这对于分页显示数据、获取固定数量的最新记录或其他需要控制输出结果规模的情况非常有用。以下是LIMIT在不同SQL数据库中的基本用法&#xff1a; MySQL和其他兼容SQL方言&#xff08;如SQLite&…