c# DbHelper的封装

c# DbHelper的封装

基于ADO.NET框架,封装了适用于多个关系型数据库的DbHelper。通过简洁明了的代码,实现了对各种数据库的高效操作。

public class DbHelper{private readonly DataBase _dataBase;public DbHelper(DataBase dataBase){_dataBase = dataBase;}public DataBase GetDataBase(){return _dataBase;}public DbConnection GetDbConnection(){var conn = _dataBase.CreationConnection();if (conn.State == ConnectionState.Closed){conn.Open();}return conn;}/// <summary>/// 执行语句/// </summary>/// <param name="sql">sql语句</param>/// <param name="cmdParms">参数</param>/// <returns></returns>public int Execute(string sql, params DbParameter[] cmdParms){using (DbConnection connection = GetDbConnection()){using (DbCommand cmd = connection.CreateCommand()){try{PrepareCommand(cmd, connection, null, sql, cmdParms);int rows = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return rows;}catch (DbException e){throw e;}}}}/// <summary>/// 批量查询/// </summary>/// <param name="sql">sql语句</param>/// <param name="cmdParms">参数</param>/// <returns></returns>public DataSet Query(string sql, params DbParameter[] cmdParms){using (DbConnection connection = GetDbConnection()){DataSet ds = new DataSet();try{DbProviderFactory factory = DbProviderFactories.GetFactory(connection);DbCommand command = factory.CreateCommand();PrepareCommand(command, connection, null, sql, cmdParms);DbDataAdapter adapter = factory.CreateDataAdapter();adapter.SelectCommand = command;adapter.Fill(ds, "ds");adapter.Dispose();command.Dispose();}catch (DbException ex){throw ex;}return ds;}}/// <summary>/// 批量查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql">sql语句</param>/// <param name="reader">数据读取器</param>/// <param name="cmdParms">参数</param>/// <returns></returns>/// <exception cref="Exception"></exception>public List<T> Query<T>(string sql, Func<IDataReader, T> reader, params DbParameter[] cmdParms){if (reader == null)throw new Exception("数据读取器是空的!");List<T> list = new List<T>();using (DbConnection connection = GetDbConnection()){using (DbCommand cmd = connection.CreateCommand()){try{PrepareCommand(cmd, connection, null, sql, cmdParms);DbDataReader myReader = cmd.ExecuteReader();cmd.Parameters.Clear();while (myReader.Read()){list.Add(reader(myReader));}myReader.Close();}catch (DbException e){throw e;}}}return list;}/// <summary>/// 单个查询/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql">sql语句</param>/// <param name="reader">数据读取器</param>/// <param name="cmdParms">参数</param>/// <returns></returns>/// <exception cref="Exception"></exception>public T QueryFirstOrDefault<T>(string sql, Func<IDataReader, T> reader, params DbParameter[] cmdParms){if (reader == null){throw new Exception("数据读取器是空的!");}var model = default(T);using (DbConnection connection = GetDbConnection()){using (DbCommand cmd = connection.CreateCommand()){try{PrepareCommand(cmd, connection, null, sql, cmdParms);DbDataReader myReader = cmd.ExecuteReader();cmd.Parameters.Clear();if (myReader.Read())model = reader(myReader);myReader.Close();}catch (DbException e){throw e;}}}return model;}/// <summary>/// 执行存储过程/// </summary>/// <param name="storedProcName">存储过程名</param>/// <param name="parameters">存储过程参数</param>/// <returns></returns>public DataSet RunProcedure(string storedProcName, DbParameter[] parameters){using (DbConnection connection = GetDbConnection()){DataSet dataSet = new DataSet();connection.Open();DbDataAdapter sqlDA = DbProviderFactories.GetFactory(connection).CreateDataAdapter();sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);sqlDA.Fill(dataSet, "ds");sqlDA.SelectCommand.Dispose();sqlDA.Dispose();return dataSet;}}/// <summary>/// 执行存储过程,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )/// </summary>/// <param name="storedProcName">存储过程名</param>/// <param name="parameters">存储过程参数</param>/// <returns>SqlDataReader</returns>public DbDataReader RunProcedureToReader(string storedProcName, DbParameter[] parameters){using (DbConnection connection = GetDbConnection()){DbDataReader returnReader;connection.Open();DbCommand command = BuildQueryCommand(connection, storedProcName, parameters);command.CommandType = CommandType.StoredProcedure;returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);command.Dispose();return returnReader;}}/// <summary>/// 执行存储过程/// </summary>/// <param name="storedProcName">存储过程名</param>/// <param name="parameters">存储过程参数</param>/// <returns>SqlDataReader</returns>public T RunProcedure<T>(string storedProcName, Func<IDataReader, T> reader, DbParameter[] parameters){if (reader == null){throw new Exception("数据读取器是空的!");}T t = default(T);using (DbConnection connection = GetDbConnection()){DbDataReader returnReader;connection.Open();DbCommand command = BuildQueryCommand(connection, storedProcName, parameters);command.CommandType = CommandType.StoredProcedure;returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);command.Dispose();if (returnReader.Read())t = reader(returnReader);returnReader.Close();}return t;}/// <summary>/// 执行存储过程/// </summary>/// <param name="storedProcName">存储过程名</param>/// <param name="parameters">存储过程参数</param>/// <returns>SqlDataReader</returns>public List<T> RunProcedureToList<T>(string storedProcName, Func<IDataReader, T> reader, DbParameter[] parameters){if (reader == null){throw new Exception("数据读取器是空的!");}List<T> list = new List<T>();using (DbConnection connection = GetDbConnection()){DbDataReader returnReader;connection.Open();DbCommand command = BuildQueryCommand(connection, storedProcName, parameters);command.CommandType = CommandType.StoredProcedure;returnReader = command.ExecuteReader(CommandBehavior.CloseConnection);command.Dispose();while (returnReader.Read())list.Add(reader(returnReader));returnReader.Close();}return list;}/// <summary>/// 返回首行首列/// </summary>/// <param name="sql">sql语句</param>/// <param name="cmdParms">参数</param>/// <returns></returns>public object ExecuteScalar(string sql, params DbParameter[] cmdParms){object result = null;using (DbConnection connection = GetDbConnection()){using (DbCommand cmd = connection.CreateCommand()){try{PrepareCommand(cmd, connection, null, sql, cmdParms);result = cmd.ExecuteScalar();}catch (DbException e){throw e;}}}return result;}/// <summary>/// 分页列表/// </summary>/// <typeparam name="T"></typeparam>/// <param name="tablename">表名(可以自定)</param>/// <param name="page">分页信息</param>/// <param name="reader">读取器</param>/// <param name="where">条件</param>/// <param name="field">字段</param>/// <param name="order">排序</param>public List<T> QueryWithPage<T>(string tablename, PageInfo page, Func<IDataReader, T> reader, string where = "", string field = "*", string order = "", params DbParameter[] cmdParms){long offset = page.Index * page.PageSize;string sql = "SELECT " + field + " FROM " + tablename;sql = ListPageSql(sql, where, order);sql = sql + " " + Limit(offset, page.PageSize);string sql2 = "SELECT COUNT(0) FROM " + tablename;sql2 = ListPageSql(sql2, where, "");string sql3 = sql + ";" + sql2;List<T> list = new List<T>();using (DbConnection conn = GetDbConnection()){using (DbCommand cmd = conn.CreateCommand()){try{PrepareCommand(cmd, conn, null, sql3, cmdParms);DbDataReader myReader = cmd.ExecuteReader();cmd.Parameters.Clear();while (myReader.Read()){list.Add(reader(myReader));}if (myReader.NextResult() && myReader.Read())page.Count = myReader.GetInt64Ex(0);myReader.Close();}catch (MySqlException e){throw new Exception(e.Message);}}}return list;}/// <summary>/// 组装分页sql/// </summary>/// <param name="sql">基础sql</param>/// <param name="where">条件</param>/// <param name="order">排序</param>/// <returns></returns>private string ListPageSql(string sql, string where, string order){if (!string.IsNullOrEmpty(where)){sql = sql + " WHERE " + where;}if (!string.IsNullOrEmpty(order)){sql = sql + " " + order;}return sql;}/// <summary>/// 分页/// </summary>/// <param name="offset">偏移</param>/// <param name="size">每页显示数据尺寸</param>/// <returns></returns>/// <exception cref="Exception"></exception>public string Limit(long offset, long size){if (offset == -1){if (_dataBase.DbType != DbBaseType.SqlServer){return "LIMIT " + size;}}else{if (_dataBase.DbType == DbBaseType.MySql){return string.Format("LIMIT {0},{1}", offset, size);}if (_dataBase.DbType == DbBaseType.PostgreSql || _dataBase.DbType == DbBaseType.Sqlite){return string.Format(" LIMIT {0} OFFSET {1}", size, offset);}}throw new Exception("暂时不支持其它分页语法");}public DbParameter CreateDbParameter(string parameterName, DbType dbType, object value){using(DbConnection connection = GetDbConnection()){DbParameter dbParameter = DbProviderFactories.GetFactory(connection).CreateParameter();dbParameter.ParameterName = parameterName;dbParameter.DbType = dbType;dbParameter.Value = value;return dbParameter;}}protected void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, string cmdText, DbParameter[] cmdParms){cmd.Connection = conn;cmd.CommandText = cmdText;if (trans != null)cmd.Transaction = trans;cmd.CommandType = CommandType.Text;SetParameters(cmd, cmdParms);}private DbCommand BuildQueryCommand(DbConnection connection, string storedProcName, DbParameter[] parameters){DbCommand command = connection.CreateCommand();command.CommandText = storedProcName;command.CommandType = CommandType.StoredProcedure;SetParameters(command, parameters);return command;}private void SetParameters(DbCommand command, DbParameter[] cmdParms){if (cmdParms != null){foreach (var parameter in cmdParms){if ((parameter.Direction == ParameterDirection.InputOutput||parameter.Direction == ParameterDirection.Input)&&(parameter.Value == null)){parameter.Value = DBNull.Value;}command.Parameters.Add(parameter);}}}}

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

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

相关文章

SpringCloud-实现基于RabbitMQ的消息队列

消息队列是现代分布式系统中常用的通信机制&#xff0c;用于在不同的服务之间传递消息。在Spring Cloud框架中&#xff0c;我们可以利用RabbitMQ实现强大而可靠的消息队列系统。本篇博客将详细介绍如何在Spring Cloud项目中集成RabbitMQ&#xff0c;并创建一个简单的消息队列。…

【Kotlin】类和对象

1 前言 Kotlin 是面向对象编程语言&#xff0c;与 Java 语言类似&#xff0c;都有类、对象、属性、构造函数、成员函数&#xff0c;都有封装、继承、多态三大特性&#xff0c;不同点如下。 Java 有静态&#xff08;static&#xff09;代码块&#xff0c;Kotlin 没有&#xff1…

Spring AOP常见面试题

目录 一、对于AOP的理解 二、Spring是如何实现AOP的 1、execution表达式 2、annotation 3、基于Spring API&#xff0c;通过xml配置的方式。 4、基于代理实现 三、Spring AOP的实现原理 四、Spring是如何选择使用哪种动态代理 1、Spring Framework 2、Spring Boot 五…

博士推荐 | 纤维与聚合物科学博士,功能性纺织品研发主管

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

二分查找【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;二分查找的简单思路&#xff0c;为什么必须在有序的前提下才能使用二分查找&#xff0c;该怎么用C程序来实现二分查找&#xff0c;二分查找的局限性&#x1f440;。 文章目录 1. 题目2. 思路3. 前提条件4. 编写程序 1. 题目 在一个有…

选择性遗忘可以帮助人工智能学得更好?

最近&#xff0c;一些计算机科学家创建了一种更灵活、更灵巧的机器学习模型。诀窍在于&#xff1a;它必须定期忘记它所知道的信息。虽然这种新方法不会取代支撑最大应用程序的庞大模型&#xff0c;但它能揭示这些程序如何理解语言的更多信息。 &#xff08;PS&#xff1a;如果…

日常007:alias给长命令起个简短的别名

alias 命令可以给那些太长的命令起一个简短的别名。便于记忆&#xff0c;提高输入效率。 用法和示例 1. 创建别名 创建别名&#xff0c;使用语法alias new_commandoriginal_command&#xff0c;例如 alias llls -lF使用别名 $ ll total 32 -rw-r--r-- 1 soulio soulio 1…

【动态规划】代码随想录算法训练营第四十六天 |139.单词拆分,关于多重背包,你该了解这些! ,背包问题总结篇!(待补充)

139.单词拆分 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词…

【Docker】Node 容器部署及配置参数

Node.js环境标准软件基于Bitnami node 构建。当前版本为20.11.1 你可以通过轻云UC部署工具直接安装部署&#xff0c;也可以手动按如下文档操作&#xff0c;该项目已经全面开源&#xff0c;可以从如下环境获取 配置文件地址: https://gitee.com/qingplus/qingcloud-platform Q…

解决报错The following packages have unmet dependencies

一、问题描述 终端输入&#xff1a; nvcc -V 提示&#xff1a; Command nvcc not found, but can be installed with:sudo apt install nvidia-cuda-toolkit按照提示安装&#xff0c;终端输入 sudo apt install nvidia-cuda-toolkit&#xff0c;报错内容如下&#xff1a; …

3分钟彻底搞懂Web UI自动化测试之【POM设计模式】

为什么要用POM设计模式 前期&#xff0c;我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本&#xff08;以快递100网站登录举例&#xff09;&#xff1a; import time from selenium import webdriver from selenium.webdriver.common.by import By dri…

Python SSH协议库之paramiko使用详解

概要 在网络编程中,远程操作是一项非常常见的需求,特别是在服务器管理和自动化任务执行方面。Python提供了许多库来实现远程操作,其中Paramiko是一个备受欢迎的选择。Paramiko是一个纯Python编写的SSH协议库,它提供了一种简单而强大的方式来执行远程命令、上传和下载文件等…

YUNBEE云贝-热烈祝贺Guo同学成功通过Oracle 19c OCP认证考试!

恭喜Guo同学在 #Oracle19c OCP 考试中取得了OCP证书&#xff01;该认证是Oracle公司的权威技术标准&#xff0c;适用于有资格为Oracle核心产品提供服务和支持的专业人员。尽管OCP认证考题随着版本变化&#xff0c;并且是全英文考试&#xff0c;对中文习惯的人来说有一定的难度&…

怎样将PPT转成文本格式?PPT文本一键生成文本格式 工作经验分享

在日常工作和学习中&#xff0c;我们经常需要将PPT文件转换为文本格式&#xff0c;以便更好地进行编辑、搜索和分享。下面&#xff0c;我将介绍2种常见的PPT转文本格式的方法&#xff0c;帮助大家轻松实现这一需求。 方法一、使用汇帮PDF转换器软件里的“PPT文件操作”菜单进行…

Git的一些基础命令

使用Git主要涉及以下几个基本步骤和概念。 1. 安装Git 首先&#xff0c;你需要在你的计算机上安装Git。可以从Git的官方网站下载安装程序。 2. 配置Git 安装Git后&#xff0c;需要配置用户信息&#xff08;用户名和电子邮件地址&#xff09;&#xff0c;因为Git的每次提交都会…

我们做的小工具,爆了!

好消息&#xff0c;好消息&#xff0c;江南皮革。。 开个玩笑&#xff0c;大家好&#xff0c;我是程序员鱼皮。 前段时间我在公众号发文宣传了团队新开发的小工具《代码小抄》&#xff0c;这是一个简单易用的代码分享工具&#xff0c;可以快速、跨设备地自由分享代码。 网址&…

K8S Pod

基本概念 Pod是K8S中非常重要的概念之一&#xff0c;是整个K8S架构的基础和核心。Pod是K8S调度的最小单位&#xff0c;是一个不可拆分的独立个体&#xff0c;K8S将多个业务上相关联的容器&#xff08;Docker容器&#xff09;合并到一起&#xff0c;组合成一个Pod&#xff0c;这…

使用Office的小伙伴一定要把这个打开!关键时候能保命

使用电脑办公的小伙伴一定离不开Office。很多小伙伴在使用Office的时候&#xff0c;基本上都是双击打开对应的软件&#xff08;Word/Excel/Powerpoint&#xff09;就直接使用。 这种直接打开之后就使用的习惯很不值得提倡。除非你要记录的东西是一分钟就能完成的。 小白在企业上…

php 上传文件报错The file failed to upload

描述&#xff1a;环境lnmp 框架laravel 上传接口调用报错The file failed to upload 一、终端搜索php.ini文件位置 [root90f8687c2388 /]# whereis php.ini php: /usr/bin/php /usr/local/php二、修改文件php.ini配置文件upload_max_filesize项 ; Maximum allowed size for …

在四维轻云中,能够上传哪些地理空间数据?

四维轻云是一款地理空间数据在线管理平台&#xff0c;支持各类地理空间数据的在线管理、浏览及分享&#xff0c;用户可不受时间地点限制&#xff0c;随时随地上传、管理、查看及分享各类地理空间数据。平台具有项目管理、场景搭建、素材库等功能模块&#xff0c;支持在线协作管…