c# 操作mysql的帮助类

MySqlHelper 的静态类,其中包含了一些用于执行 MySQL 数据库操作的方法。这些方法包括执行存储过程、插入、更新、删除操作以及执行数据库事务查询操作等。

该类中的方法主要有:

  1. ExecuteNonQuery 方法:用于执行存储过程、插入、更新、删除操作,并返回受影响的行数。
  2. ExecuteScalar 方法:执行数据库事务查询操作或普通查询操作,返回结果集中位于第一行第一列的值。
  3. PrepareCommand 方法:执行数据库命令前的准备工作,设置命令对象的属性和参数。
  4. ToObject 方法:将 MySqlDataReader 转换为指定类型的对象。
  5. 其他辅助方法:用于处理参数、设置属性值、转换值等。

这些方法使用了异步编程模型 async/await,并且在执行数据库操作后进行了相应的资源释放,以确保数据库连接得到正确关闭。

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;namespace MSEBP.Kernel.DataCommon.DBHelper
{/// <summary>/// MySql数据库操作类/// </summary>public static class MySqlHelper{private static string _connectionString = MSEApplication.GetConfigValue("ConnectionStrings:ReadConn");/// <summary>/// 用于执行存储过程、插入、更新、删除/// </summary>/// <param name="cmdType"></param>/// <param name="cmdText"></param>/// <param name="cmdParms"></param>/// <returns></returns>public static async Task<int> ExecuteNonQuery(CommandType cmdType, string cmdText, object cmdParms){using (MySqlConnection conn = new MySqlConnection(_connectionString)){using (MySqlCommand cmd = conn.CreateCommand()){try{PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);int result = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return await Task.FromResult(result);}catch (Exception ex){throw ex;}finally{if (conn.State == ConnectionState.Open){conn.Close();}}}}}/// <summary>/// 执行数据库事务查询操作,返回结果集中位于第一行第一列的Object类型的值/// </summary>/// <param name="trans">一个已存在的数据库事务对象</param>/// <param name="cmdType">命令类型</param>/// <param name="cmdText">MySql存储过程名称或PL/SQL命令</param>/// <param name="cmdParms">命令参数集合</param>/// <returns>当前事务查询操作返回的结果集中位于第一行第一列的Object类型的值</returns>public static async Task<T> ExecuteScalar<T>(MySqlTransaction trans, CommandType cmdType, string cmdText, object cmdParms){MySqlConnection conn;if (trans != null){conn = trans.Connection;if (conn == null)throw new ArgumentException("当前事务所在的数据库连接不存在");}else{conn = new MySqlConnection(_connectionString);}using (MySqlCommand cmd = conn.CreateCommand()){try{object result = null;PrepareCommand(cmd, conn, trans, cmdType, cmdText, cmdParms);result = cmd.ExecuteScalar();cmd.Parameters.Clear();return await Task.FromResult(ConvertTo<T>(result));}catch (Exception ex){throw ex;}finally{if (trans == null){if (conn.State == ConnectionState.Open){conn.Close();}}}}}/// <summary>/// 执行数据库查询操作,返回结果集中位于第一行第一列的Object类型的值/// </summary>/// <param name="cmdType">Command类型</param>/// <param name="cmdText">MySql存储过程名称或PL/SQL命令</param>/// <param name="cmdParms">命令参数集合</param>/// <returns>当前查询操作返回的结果集中位于第一行第一列的Object类型的值</returns>public static async Task<T> ExecuteScalar<T>(CommandType cmdType, string cmdText, object cmdParms){using (MySqlConnection conn = new MySqlConnection(_connectionString)){using (MySqlCommand cmd = conn.CreateCommand()){try{object result = null;PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);result = cmd.ExecuteScalar();cmd.Parameters.Clear();return await Task.FromResult(ConvertTo<T>(result));}catch (Exception ex){throw ex;}finally{if (conn.State == ConnectionState.Open){conn.Close();}}}}}/// <summary>/// 执行数据库命令前的准备工作/// </summary>/// <param name="cmd">Command对象</param>/// <param name="conn">数据库连接对象</param>/// <param name="trans">事务对象</param>/// <param name="cmdType">Command类型</param>/// <param name="cmdText">MySql存储过程名称或PL/SQL命令</param>/// <param name="cmdParms">命令参数集合</param>private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, object cmdParms){if (conn?.State != ConnectionState.Open)conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText;if (trans != null)cmd.Transaction = trans;cmd.CommandType = cmdType;cmd.CommandTimeout = 60 * 2;if (cmdParms != null){if (cmdParms is IDictionary<string, object> dict){foreach (var item in dict){cmd.Parameters.AddWithValue($"@{item.Key}", item.Value ?? DBNull.Value);}}else{PropertyInfo[] properties = cmdParms.GetType().GetProperties();foreach (PropertyInfo property in properties){object value = property.GetValue(cmdParms);cmd.Parameters.AddWithValue($"@{property.Name}", value ?? DBNull.Value);}}}}/// <summary>/// /// </summary>/// <param name="cmdParms"></param>/// <returns></returns>private static IEnumerable<MySqlParameter> GetParameters(object cmdParms){if (cmdParms is null)yield break;if (cmdParms is IDictionary<string, object> dict){foreach (var item in dict){yield return new MySqlParameter($"@{item.Key}", item.Value ?? DBNull.Value);}}else{var properties = cmdParms.GetType().GetProperties();foreach (var property in properties){var value = property.GetValue(cmdParms);yield return new MySqlParameter($"@{property.Name}", value ?? DBNull.Value);}}}/// <summary>///  reader转成类型数据/// </summary>/// <typeparam name="T"></typeparam>/// <param name="reader"></param>/// <returns></returns>public static T ToObject<T>(this MySqlDataReader reader){if (!reader.HasRows)return default(T);Type type = typeof(T);if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal) || type == typeof(DateTime) || type == typeof(Guid) || type.IsEnum || type.IsArray){reader.Read(); // 移动到第一行object value = reader.GetValue(0);return value == DBNull.Value ? default(T) : ConvertTo<T>(value);}int columnCount = reader.FieldCount;var properties = type.GetProperties().Where(p => p.CanWrite);T obj = (T)Activator.CreateInstance(type);if (reader.Read()) // 读取第一行数据{foreach (var property in properties){int columnIndex = Enumerable.Range(0, columnCount).FirstOrDefault(i => string.Compare(reader.GetName(i), property.Name,StringComparison.OrdinalIgnoreCase) == 0);if (columnIndex >= 0){object value = reader.IsDBNull(columnIndex) ? null : reader.GetValue(columnIndex);if (value != DBNull.Value){if (property.PropertyType.IsEnum){value = Enum.Parse(property.PropertyType, value.ToString());}else{value = ConvertValue(value, property.PropertyType);}SetProperty(property, value, obj);}}}}reader.Dispose();reader.Close();return obj;}/// <summary>/// 设置值/// </summary>/// <param name="property"></param>/// <param name="value"></param>/// <param name="obj"></param>private static void SetProperty(PropertyInfo property, object value, object obj){if (value == null) return;if (property.PropertyType == typeof(Guid)){value = Guid.Parse(value.ToString());}else if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)){Type underlyingType = Nullable.GetUnderlyingType(property.PropertyType);value = Convert.ChangeType(value, underlyingType);}else{value = Convert.ChangeType(value, property.PropertyType);}property.SetValue(obj, value, null);}/// <summary>/// 转换值/// </summary>/// <param name="value"></param>/// <param name="type"></param>/// <returns></returns>private static object ConvertValue(object value, Type type){if (type == typeof(Guid)){return Guid.Parse(value.ToString());}if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)){Type underlyingType = Nullable.GetUnderlyingType(type);if (value == null){return null;}else{return Convert.ChangeType(value, underlyingType);}}return Convert.ChangeType(value, type);}/// <summary>/// 单值数据类型转换/// </summary>/// <typeparam name="T"></typeparam>/// <param name="value"></param>/// <returns></returns>private static T ConvertTo<T>(object value){if (value == null || value == DBNull.Value){return default(T);}Type targetType = typeof(T);if (targetType == typeof(Guid)){return (T)(object)Guid.Parse(value.ToString());}if (targetType.IsGenericType && targetType.GetGenericTypeDefinition() == typeof(Nullable<>)){targetType = Nullable.GetUnderlyingType(targetType);}return (T)Convert.ChangeType(value, targetType);}}
}

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

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

相关文章

如何降低布隆过滤器的误判率

降低布隆过滤器的误判率&#xff08;也称为假阳性率&#xff09;是布隆过滤器应用中一个关键的问题。误判率主要来源于哈希碰撞&#xff0c;即不同的元素可能被哈希到相同的位置。为了降低误判率&#xff0c;可以从以下几个方面进行优化&#xff1a; 1. 增加哈希函数的个数 原…

Asp.net Core 反射加载dll

定义一个类库&#xff0c;定义接口 namespace Plugin {public interface IPlugin{void EllisTest();} }定义另外一个类库&#xff0c;引用上面的类库&#xff0c;实现接口 using Plugin;namespace UserCustom {public class Custom : IPlugin{public void EllisTest(){Conso…

二刷力扣——DP算法(子序列问题)

300. 最长递增子序列 定义是以本元素结尾&#xff0c;所以公式初始化都好弄。但是太慢 class Solution {public int lengthOfLIS(int[] nums) {int nnums.length;int[] dp new int[n];//以自己结尾的最长递增子序列dp[0]1;int maxzi1;for(int i1;i<n;i){dp[i]1;for(int j…

QT中QDomDocument读写XML文件

一、XML文件 <?xml version"1.0" encoding"UTF-8"?> <Begin><Type name"zhangsan"><sex>boy</sex><school>Chengdu</school><age>18</age><special>handsome</special>&l…

【YOLOv5进阶】——引入注意力机制-以SE为例

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、站在巨人的肩膀上 SE模块即Squeeze-and-Excitation 模块&#xff0c;这是一种常用于卷积神经网络中的注意力机制&#xff01;&#xff01; 借鉴代码的代码链接如下&a…

在C#中使用RabbitMQ做个简单的发送邮件小项目 _

前言 好久没有做项目了&#xff0c;这次做一个发送邮件的小项目。发邮件是一个比较耗时的操作&#xff0c;之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方的&#xff0c;不过当时只是简单的进行了异步操作。那么这次来使用RabbitMQ去统一发送邮件&#x…

vue中路由来回切换页面直接卡死

今天发现一个很严重的问题&#xff0c;项目好不容易做好了&#xff0c;结果页面多了&#xff0c;切换之后卡死。页面所有的交互效果都失效了。 排查了许久的错误原因最后发现原来是路由名称重复了。 如上图当页面跳转到riskdetails详细页面之后&#xff0c;框架则被这个详情页…

随机森林R语言预测工具

随机森林&#xff08;Random Forest&#xff09;是一种基于决策树的集成学习方法&#xff0c;它通过构建多个决策树并集成它们的预测结果来提高预测的准确性。在R语言中&#xff0c;我们可以使用randomForest包来构建和训练随机森林模型。以下是对随机森林的详细介绍以及使用R语…

java高仿真数据生成器-需要的拿去

java高仿真数据生成器源码-需要的拿去 nit-random-tools 介绍&#xff1a;高仿真数据生成器 逆天开源 java 证号码, 姓名&#xff0c;职业, 日期&#xff0c;手机号 生成器 功能列表 编号功能描述class1号 生成器NitIdcardGenerator2姓名 生成器NitChineseNameGenerator3职…

node.lib下载失败,手动下载并配置

在无网络环境&#xff0c;或者网络不好的环境&#xff0c;node.lib会下载失败&#xff0c;此时可手动下载并进行配置。 我们以 node16.17.0 为例&#xff1a; 下载地址 分别下载node.lib和headers https://registry.npmmirror.com/-/binary/node/v16.17.0/win-x64/node.lib…

目标检测算法的技术革新与应用案例

引言 目标检测作为计算机视觉领域中的一项关键技术&#xff0c;近年来取得了显著进展。从传统的基于特征的方法到如今的深度学习算法&#xff0c;目标检测技术在准确性、速度和鲁棒性上均实现了大幅提升。本文将深入探讨目标检测算法的技术原理、发展历程、最新进展以及实际应…

HarmonyOS--开发者证书考试地址

初级证书&#xff1a;华为开发者学堂 高级证书&#xff1a;华为开发者学堂 对应课程&#xff1a;华为开发者学堂

Linux rpm与yum

一、rpm包管理 rpm用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager (RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的setup.exe&#xff0c;这一文件格式名称虽然打上了R…

办理北京公司注销流程和步骤说明

公司的生命周期是多变的&#xff0c;有时候&#xff0c;业务可能会结束或者出现其他原因&#xff0c;需要注销公司。注销公司是一个复杂的法律过程&#xff0c;需要遵循一系列的步骤和提交特定的材料。下面我们将详细介绍北京注销公司的流程以及需要准备的材料&#xff0c;以帮…

《等保测评实战指南:从评估到加固的全程解析》

在当今数字化时代&#xff0c;信息安全已成为企业生存与发展的基石。随着网络攻击手段的不断演变和复杂度的提升&#xff0c;信息系统等级保护&#xff08;简称“等保”&#xff09;作为国家信息安全保障体系的重要组成部分&#xff0c;其重要性日益凸显。《等保测评实战指南&a…

私有云统一多云管理平台主要服务内容

私有云统一多云管理平台&#xff0c;作为企业IT架构现代化的关键组成部分&#xff0c;旨在为企业提供高效、灵活、安全的云计算资源管理解决方案。这类平台通过整合和优化不同云环境(包括私有云、公有云、混合云)的管理&#xff0c;帮助企业打破云孤岛&#xff0c;实现资源的统…

clickhouse-client 数据导入导出

ClickHouse提供了clickhouse-client客户端可用于数据的快速导入导出 官方文档&#xff1a; Inserting Data from a File JSONL 格式 导出 clickhouse-client -h 127.0.0.1 --port 9000 -u default --password XXX -d default \--query "SELECT * from default.doc_typ…

【游戏引擎之路】登神长阶(五)

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-6月30日&#xff1a;攻克《Windows游戏编程大师技巧》。 …

【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

从任意用户注册到任意密码重置

写在最前面一句话 To be or not to be ,it‘s a question . 哎呀&#xff0c;放错台词了&#xff0c;应该是 true or false , 在最近的测试中遇到了一个很有趣的点 “将 false 改为true ”就可以成功绕过验证码了。 T rue or false &#xff1f;&#xff1f;&#xff1f; …