ADO.NET封装个单例异步类类

.NET兼职社区
防止重复造轮子。可以直接使用

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;namespace Wpf.PersonnelNotice
{public sealed class AdoNetAsyncHelper{private static readonly Lazy<AdoNetAsyncHelper> lazy =new Lazy<AdoNetAsyncHelper>(() =>{string connectionString = ConfigurationManager.ConnectionStrings["DatabaseConnection"].ConnectionString;return new AdoNetAsyncHelper(connectionString);});public static AdoNetAsyncHelper Instance { get { return lazy.Value; } }private readonly string _connectionString;private AdoNetAsyncHelper(string connectionString){_connectionString = connectionString;}// 异步插入public async Task<int> InsertAsync<T>(string tableName, T entity, params string[] columns){using (var connection = new SqlConnection(_connectionString)){await connection.OpenAsync();var command = BuildInsertCommand(tableName, entity, columns);command.Connection = connection;return await command.ExecuteNonQueryAsync();}}// 异步更新public async Task<int> UpdateAsync<T>(string tableName, T entity, string primaryKeyColumn, params string[] columns){using (var connection = new SqlConnection(_connectionString)){await connection.OpenAsync();var command = BuildUpdateCommand(tableName, entity, primaryKeyColumn, columns);command.Connection = connection;return await command.ExecuteNonQueryAsync();}}// 异步删除public async Task<int> DeleteAsync<T>(string tableName, T entity, string primaryKeyColumn){using (var connection = new SqlConnection(_connectionString)){await connection.OpenAsync();var command = BuildDeleteCommand(tableName, entity, primaryKeyColumn);command.Connection = connection;return await command.ExecuteNonQueryAsync();}}// 异步查询单个实体public async Task<T> GetSingleAsync<T>(string sql, Func<IDataRecord, T> mapper, params SqlParameter[] parameters){using (var connection = new SqlConnection(_connectionString)){await connection.OpenAsync();using (var command = new SqlCommand(sql, connection)){command.Parameters.AddRange(parameters);using (var reader = await command.ExecuteReaderAsync(CommandBehavior.SingleRow)){if (await reader.ReadAsync()){return mapper(reader);}return default(T);}}}}// 构建插入命令private SqlCommand BuildInsertCommand<T>(string tableName, T entity, string[] columns){// 这里假设entity属性名与数据库列名一致,实际情况可能需要反射或其他方式映射var columnNames = string.Join(", ", columns);var parameterNames = string.Join(", ", columns.Select(c => "@" + c));var cmdText = $"INSERT INTO {tableName} ({columnNames}) VALUES ({parameterNames})";var command = new SqlCommand(cmdText);foreach (var col in columns){var prop = typeof(T).GetProperty(col);if (prop != null){command.Parameters.AddWithValue("@" + col, prop.GetValue(entity));}}return command;}// 构建更新命令private SqlCommand BuildUpdateCommand<T>(string tableName, T entity, string primaryKeyColumn, string[] columns){// 这里同样假设entity属性名与数据库列名一致,实际情况需自行调整var setClauses = string.Join(", ", columns.Select(c => $"{c} = @{c}"));var cmdText = $"UPDATE {tableName} SET {setClauses} WHERE {primaryKeyColumn} = @{primaryKeyColumn}";var command = new SqlCommand(cmdText);foreach (var col in columns.Concat(new[] { primaryKeyColumn })){var prop = typeof(T).GetProperty(col);if (prop != null){command.Parameters.AddWithValue("@" + col, prop.GetValue(entity));}}return command;}// 构建删除命令private SqlCommand BuildDeleteCommand<T>(string tableName, T entity, string primaryKeyColumn){var cmdText = $"DELETE FROM {tableName} WHERE {primaryKeyColumn} = @{primaryKeyColumn}";var command = new SqlCommand(cmdText);var prop = typeof(T).GetProperty(primaryKeyColumn);if (prop != null){command.Parameters.AddWithValue("@" + primaryKeyColumn, prop.GetValue(entity));}return command;}// 异步批量插入public async Task BatchInsertAsync<T>(string tableName, IEnumerable<T> entities, string[] columns){using (var connection = new SqlConnection(_connectionString)){await connection.OpenAsync();using (var bulkCopy = new SqlBulkCopy(connection)){bulkCopy.DestinationTableName = tableName;foreach (var column in columns){bulkCopy.ColumnMappings.Add(column, column);}using (var dataTable = ConvertToDataTable(entities, columns)){await bulkCopy.WriteToServerAsync(dataTable);}}}}// 将实体集合转换为DataTableprivate DataTable ConvertToDataTable<T>(IEnumerable<T> entities, string[] columns){var dataTable = new DataTable();foreach (var columnName in columns){dataTable.Columns.Add(columnName);}foreach (var entity in entities){var dataRow = dataTable.NewRow();foreach (var columnName in columns){var propertyInfo = typeof(T).GetProperty(columnName);if (propertyInfo != null){dataRow[columnName] = propertyInfo.GetValue(entity);}}dataTable.Rows.Add(dataRow);}return dataTable;}// 异步查询多条记录并转换为指定类型的集合public async Task<List<T>> QueryMultipleAsync<T>(string sql, Func<IDataRecord, T> mapper, params SqlParameter[] parameters){var result = new List<T>();using (var connection = new SqlConnection(_connectionString)){await connection.OpenAsync();using (var command = new SqlCommand(sql, connection)){command.Parameters.AddRange(parameters);using (var reader = await command.ExecuteReaderAsync()){while (await reader.ReadAsync()){result.Add(mapper(reader));}}}}return result;}}
}

使用方式:

  string sql = @"SELECT TOP (1) ProcInstID, Companies, chkEmployeeTypes FROM TableNameWHERE isall = @isall ORDER BY ProcInstID";SqlParameter isAllParam = new SqlParameter("@isall", SqlDbType.Bit) { Value = false }; // 参数值设置为falseTask<QueryConditions> task = AdoNetAsyncHelper.Instance.GetSingleAsync<QueryConditions>(sql,record => new QueryConditions{ID = (int)record["ID"],Companies = (string)record["Companies"],chkEmployeeTypes = (string)record["chkEmployeeTypes"]},isAllParam);// 等待任务完成并获取查询结果QueryConditions singleResult = await task;

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

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

相关文章

python(django)之产品后台管理功能实现

1、添加新项目 在命令行输入以下代码 python manage.py startapp prroduct 2、添加路径和代码结构 在新项目目录下admin.py中加入以代码 from .models import Product class ProductAdmin(admin.ModelAdmin):list_display [product_name, product_desc,producter,created_…

基于Springboot的闲置图书分享(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的闲置图书分享&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

Linux服务器导出CPU和内存使用情况

Linux服务器默认存储一个月的CPU和内存记录&#xff0c;所在目录&#xff1a;/var/log/sa/&#xff0c;如下图所示 在此用sar命令来执行 sar是一个比较全面的性能监控工具&#xff0c;包括cpu、内存、磁盘和网络等信息&#xff0c;并且该命令会每10分钟自动保存一次硬件资源使用…

odoo扩展导出pdf功能

1. 说明: odoo原生导出功能扩展导出pdf文件功能, 如有额外需求请联系博主 2. 版本说明: odoo版本: odoo15 其他odoo版本未进行测试,如有需要自行测试 3. 地址: 该补丁代码放在github仓库, 地址: https://github.com/YSL-Alpaca/odoo_export_pdf 4. 改补丁依赖于第三方软件wkh…

ubuntu20.04搭建nginx rtmp视频服务到指定位置解决权限不足

1.安装依赖 apt-get install build-essential libpcre3 libpcre3-dev libssl-dev2.建一个目录 mldir rtmp_nginx 3.源码下载 wget http://nginx.org/download/nginx-1.21.6.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/master.zip4.解压缩 tar -xf ng…

JPA使用CriteriaQuery实现动态分组查询

JPA中实现动态分组查询&#xff0c;即输入几个筛选参数就按照几个参数进行分组查询&#xff0c;但是不知道输入的是几个参数&#xff0c;要实现动态的分组查询&#xff0c;用CriteriaQuery实现。 Repository&#xff1a; Repository public interface TestCostRepository ext…

IBM SPSS Statistics for Mac v27.0.1中文激活版

IBM SPSS Statistics for Mac是一款功能强大的统计分析软件&#xff0c;专为Mac用户设计&#xff0c;用于数据分析和决策支持。该软件拥有直观易用的界面和丰富多样的统计工具&#xff0c;使得用户可以轻松进行数据处理、分析和解释。 软件下载&#xff1a;IBM SPSS Statistics…

《适配器模式(极简c++)》

本文章属于专栏《设计模式&#xff08;极简c版&#xff09;》 继续上一篇《原型模式&#xff08;极简c&#xff09;》。本章简要说明适配器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案&#xff1a; 适配器模式&#xff0c;允许接口不兼容…

sentinel热点参数流控

1、概念 热点参数限流会统计传入参数中的热点参数&#xff0c;并根据配置的限流阈值与模式&#xff0c;对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制&#xff0c;仅对包含热点参数的资源调用生效。 2、示例 2.1、目的 对于如下的/get接口的参…

WebSocket 使用示例,后台为nodejs

效果图 页面代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>WebSocket Client</title&g…

stm32定时器

定时器介绍 软件定时 缺点&#xff1a;不精确、占用 CPU 资源 还记得以前在开发C51的时候&#xff0c;经常使用stc助手生成的定时代码&#xff0c;形如&#xff1a; void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} …

Macos docker安装达梦数据库

官网下载达梦docker镜像安装包 导入安装包 docker load -i /Users/yeungsinsin/Downloads/dm8_20230808_rev197096_x86_rh6_64_single.tar查看导入的镜像 docker images4. docker run 启动容器 docker run -d -p 30236:5236 --restartalways --name dm8 --privilegedtrue -e…

基于深度学习的心律异常分类系统设计——算法设计

基于深度学习的心律异常分类系统——算法设计 第一章 研究背景算法流程本文研究内容 第二章 心电信号分类理论基础心电信号产生机理MIT-BIH 心律失常数据库 第三章 心电信号预处理心电信号噪声来源与特点基线漂移工频干扰肌电干扰 心电信号读取与加噪基于小波阈值去噪技术的应用…

FFmpeg-- mp4文件合成2:pcm和yuv编码(c++实现)

文章目录 流程音频视频 api核心代码audioencoder.haudioencoder.cppvideoencoder.hvideoencoder.cpp pcm和yuv编码为aac和h264&#xff0c;封装为c的AudioEncoder类和VideoEncoder类 流程 音频 初始化音频参数 int InitAAC(int channels, int sample_rate, int bit_rate); 音…

手机抓包也太简单好玩了吧!

我们选择Charles来作为抓包工具&#xff0c;本文将从0到1讲解从电脑端抓包到手机端抓包。 Charles是一款被广泛使用的网络抓包工具&#xff0c;它可以用来监控和调试通过HTTP和HTTPS协议发送和接收的所有网络请求和响应。Charles通常用于网页和网络应用的开发过程中&#xff0…

mac上系统偏好里无法停止mysql

使用强制杀死进程&#xff1a; sudo kill -9 pid原文&#xff1a;https://www.cnblogs.com/yalong/p/14136997.html 命令行也没有关闭成功&#xff1a;https://blog.51cto.com/u_5018054/5101645

基于python+vue家政服务系统flask-django-php-nodejs

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低家政公司的运营人员成本&#xff0c;实现了家政服务的标准化、制度化、程序化的管理&#xff0c;有效地防止了家政服务的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确地…

9.测试教程-性能测试概述

文章目录 1.常见的性能问题2.为什么要进行性能测试3.性能测试实施的流程4.概念和术语介绍5.性能测试模型6.性能测试方法介绍7.性能测试实施与管理8.性能测试前期准备9.测试工具引入10.性能测试方案11.性能测试设计与开发12.性能测试设计与管理13.性能测试设计与调优14.性能测试…

【.net/.net core】后台生成echarts图片解决方案及.net core html转word方法

工具环境下载&#xff1a; EChartsConvert&#xff1a;https://gitee.com/saintlee/echartsconvert EChartsConvert为生成echarts图片的服务端&#xff0c;用于接收参数和生成echarts图表图片BASE64编码 PhantomJS:Download PhantomJS PhantomJS用来发布EChartsConvert服务…

在 3D 虚拟城市中展示自定义建筑

在本教程中&#xff0c;您将学习如何创建 Cesium 应用程序&#xff0c;用您自己的 3D 模型替换真实城市中的建筑物。您可以使用它来可视化拟建建筑的影响&#xff0c;及如何改变天际线&#xff1f;从特定楼层或房间看到的景色会是什么样子&#xff1f; 我们将介绍如何&#xf…