闲来无事,写一个通用的直持多数据库的DBHelper,支持单连接批量执行SQL

因为用了TransactionScope所以请引用System.TransactionScope.dll

代码尚未测试,请不要在生产环境中使用,后续会用测试好的代码替换,并会持续支持,欢迎大家一起学习

欢迎加入 QQ群一起学习 254082423

废话不多说直接上代码

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Utility
{internal class DbObject{/// <summary>/// 脚本/// </summary>internal string CommandText{get;set;}/// <summary>/// 脚本参数集/// </summary>internal IList<IDbDataParameter> DbParameters{get;}}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Transactions;namespace Utility
{internal class DBHelper<T> where T : class, IDbConnection, new(){/// <summary>/// 装载参数/// </summary>/// <param name="command"></param>/// <param name="parameters"></param>private void PrepareDbParameters(IDbCommand command, IDbDataParameter[] parameters){if (Equals(command, null))throw new Exception("Command对象不能为空");foreach (var item in parameters)command.Parameters.Add(item);}private void PrepareDbParameters(IDbCommand command, IList<IDbDataParameter> parameters){if (Equals(command, null))throw new Exception("Command对象不能为空");foreach (var item in parameters)command.Parameters.Add(item);}/// <summary>/// 执行查询/// </summary>/// <typeparam name="U"></typeparam>/// <param name="connectionString">连接字符串</param>/// <param name="commandText">查询语句</param>/// <param name="parameters">查询参数</param>/// <returns>数据集</returns>internal DataSet ExecuteQuery<U>(string connectionString, CommandType commandType, string commandText,IDbDataParameter[] parameters)where U : class, IDbDataAdapter, new(){using (IDbConnection conn = new T()){conn.ConnectionString = connectionString;IDbCommand command = conn.CreateCommand();command.CommandType = commandType;command.CommandText = commandText;this.PrepareDbParameters(command, parameters);using (var ds = new DataSet()){IDbDataAdapter adapter = new U();adapter.SelectCommand = command;adapter.Fill(ds);return ds;}}}/// <summary>/// 执行查询/// </summary>/// <param name="connectionString">连接字符串</param>/// <param name="commandType">脚本类型</param>/// <param name="commandText">执行的脚本</param>/// <param name="parameters">执行参数</param>/// <param name="behavior">查询结果行为</param>/// <returns></returns>internal IDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText,IDbDataParameter[] parameters, CommandBehavior behavior){using (IDbConnection conn = new T()){conn.ConnectionString = connectionString;IDbCommand command = conn.CreateCommand();command.CommandType = commandType;command.CommandText = commandText;this.PrepareDbParameters(command, parameters);if (conn.State == ConnectionState.Broken)conn.Close();if (conn.State != ConnectionState.Open)conn.Open();using (var reader = command.ExecuteReader(behavior)){return reader;}}}/// <summary>/// 执行SQL/// </summary>/// <param name="connectionString"></param>/// <param name="commandType"></param>/// <param name="commandText"></param>/// <param name="parameters"></param>internal U ExecuteScalar<U>(string connectionString, CommandType commandType, string commandText,IDbDataParameter[] parameters)where U : struct{using (IDbConnection conn = new T()){conn.ConnectionString = connectionString;IDbCommand command = conn.CreateCommand();command.CommandType = commandType;command.CommandText = commandText;this.PrepareDbParameters(command, parameters);if (conn.State == ConnectionState.Broken)conn.Close();if (conn.State != ConnectionState.Open)conn.Open();var result = (U)command.ExecuteScalar();conn.Close();return result;}}/// <summary>/// 批量执行SQL/// </summary>/// <param name="connectionString"></param>/// <param name="commandType"></param>/// <param name="commandText"></param>/// <param name="parameters"></param>/// <param name="behavior"></param>/// <returns></returns>internal IList<U> ExecuteScalarBatch<U>(string connectionString, CommandType commandType, IList<DbObject> dbObjects)where U : struct{using (IDbConnection conn = new T()){using (TransactionScope trans = new TransactionScope()){IList<U> list = new List<U>();try{for (var i = 0; i < dbObjects.Count; i++){var curDbObj = dbObjects[i];conn.ConnectionString = connectionString;IDbCommand command = conn.CreateCommand();command.CommandType = commandType;command.CommandText = curDbObj.CommandText;this.PrepareDbParameters(command, curDbObj.DbParameters.ToArray());if (conn.State == ConnectionState.Broken)conn.Close();if (conn.State != ConnectionState.Open)conn.Open();var result = (U)command.ExecuteScalar();list.Add(result);trans.Complete();}}catch (Exception ex){                        throw ex;}return list;}}}/// <summary>/// 执行SQL/// </summary>/// <param name="connectionString"></param>/// <param name="commandType"></param>/// <param name="commandText"></param>/// <param name="parameters"></param>/// <param name="behavior"></param>/// <returns></returns>internal int ExecuteNoneQuery(string connectionString, CommandType commandType, string commandText,IDbDataParameter[] parameters, CommandBehavior behavior){using (IDbConnection conn = new T()){conn.ConnectionString = connectionString;IDbCommand command = conn.CreateCommand();command.CommandType = commandType;command.CommandText = commandText;this.PrepareDbParameters(command, parameters);if (conn.State == ConnectionState.Broken)conn.Close();if (conn.State != ConnectionState.Open)conn.Open();int affectCount = command.ExecuteNonQuery();return affectCount;}}/// <summary>/// 批量执行SQL/// </summary>/// <param name="connectionString"></param>/// <param name="commandType"></param>/// <param name="commandText"></param>/// <param name="parameters"></param>/// <param name="behavior"></param>/// <returns></returns>internal IList<int> ExecuteNoneQueryBatch<U>(string connectionString, CommandType commandType, IList<DbObject> dbObjects){using (IDbConnection conn = new T()){using (TransactionScope trans = new TransactionScope()){IList<int> list = new List<int>();try{for (var i = 0; i < dbObjects.Count; i++){var curDbObj = dbObjects[i];conn.ConnectionString = connectionString;IDbCommand command = conn.CreateCommand();command.CommandType = commandType;command.CommandText = curDbObj.CommandText;this.PrepareDbParameters(command, curDbObj.DbParameters.ToArray());if (conn.State == ConnectionState.Broken)conn.Close();if (conn.State != ConnectionState.Open)conn.Open();var result = command.ExecuteNonQuery();list.Add(result);trans.Complete();}}catch (Exception ex){throw ex;}return list;}}}}
}

后续会放出基于该类的SqlHelper

转载于:https://www.cnblogs.com/bygrace/p/5960968.html

打造 通用的 支持多数据库 操作的 DBHelper相关推荐

  1. SpringBoot(13)--- 数据库操作(集成MyBatis)

    SpringBoot 数据库操作(集成MyBatis) Spring对持久化的支持,不单只支持JDBC,为各种支持的持久化技术都提供了简单的模板和回调: ORM持久化技术 模板类 JDBC(JdbcT ...

  2. 一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE

    这是一个.net下操作数据库(结构数据库)的工具类,支持sqlserver.oracle.mysql.postgres.sqlite.access等常见数据库. 注意:它并不是一个orm工具(常见的o ...

  3. mysql数据迁移到sqlserver_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...

    这是一个.net下操作数据库(结构数据库)的工具类,支持sqlserver.oracle.mysql.postgres.sqlite.access等常见数据库. 注意:它并不是一个orm工具(常见的o ...

  4. oledb vc访问mdb数据库_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...

    这是一个.net下操作数据库(结构数据库)的工具类,支持sqlserver.oracle.mysql.postgres.sqlite.access等常见数据库. 注意:它并不是一个orm工具(常见的o ...

  5. 如何将Android数据库操作通用化(四)

    概述 明窗半掩小庭幽夜静灯残未待留 风冷结阴寒落叶别离长倚望高楼 迟迟月影斜依竹叠叠诗余赋旅愁 将欲断肠随断梦雁飞连阵几声秋 概述 上一篇文章,已经解决了前两个问题,那么现在我们继续. 首先,我们回顾 ...

  6. Android sqlite数据库操作通用框架AHibernate(二)源码-用于交流

    贴出源代码供大家交流使用,欢迎朋友们对代码提供宝贵意见,直接写到评论中即可.使用示例和步骤见上一篇博客:http://blog.csdn.net/lk_blog/article/details/745 ...

  7. C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码

    最近支付权限客户1000元辛苦费,把走火入魔通用权限管理系统中里的英文语言包进行了彻底完善,大概耗费了2周工作时间,经过一轮测试修正后就可以正式交付使用了.好在原先通用权限管理系统设计时就按支持多语言 ...

  8. php加数据库开发案例,PHP简单数据库操作类实例【支持增删改查及链式操作】

    本文实例讲述了PHP简单数据库操作类.分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了.但是很多时候却又对数据库SQL语句的繁杂而感到头疼.提供一个我自己使用的数据库操作类 ...

  9. Android sqlite数据库操作通用框架AHibernate(一)-CRUD示例和使用步骤

    AHibernate简介 一句话描述,使用AHibernate框架进行sqlite数据库操作您将从重复性劳动中解脱出来. (一)支持功能: 1.自动建表,支持属性来自继承类:可根据注解自动完成建表,并 ...

最新文章

  1. 自学python之路(day2)
  2. Visual Studio 2017软件安装教程
  3. 从weblogic的一个教训
  4. Windows下安装MySQL压缩zip包
  5. ./ffmpeg: error while loading shared libraries: libavdevice.so.57
  6. Cisco三层交换机DHCP中继简单配置
  7. 倒立摆自动起摆_今天起,中山街坊可以去唱K、游泳、看电影、摆喜酒了!
  8. Guice进阶之整合mybatis和druid
  9. php soecket服务器搭建_PHP socket 服务器框架集
  10. 安装oracle 11g时,报启动服务出现错误,找不到OracleMTSRecoveryService的解决方法
  11. X86 register
  12. 本人账户登录计算机黑屏,电脑开机输入系统密码后就黑屏了,怎么办
  13. 前后端分离前端框架的主要内容是什么?
  14. Flutter夜神模拟器调试及Vscode开发
  15. 初学微信云开发,云函数实现两数相加
  16. 做了五年Android,我顿悟了...
  17. SuperSet (真)完全汉化
  18. mysql doesnt have a default value_导入mysql数据的时候提示Field * doesn't have a default value解决方法...
  19. 0. 让我尝试说服你开始尝试OCaml
  20. HTTP协议详解 - 通过C++实现HTTP服务剖析HTTP协议

热门文章

  1. ajax_异步交互-get/post方式
  2. 2.监控软件zabbix-客户端安装
  3. 栈的应用实例——计算后缀表达式
  4. Android应用开发相关下载资源
  5. 浅析epoll – epoll函数深入讲解
  6. 怎样用matlab模型建立,怎样在matlab里建立一个BP神经网络模型?
  7. cs架构嵌入bs_车牌识别CS架构和BS架构详解
  8. 1127: 第三章:再见,林静!
  9. c语言贪吃蛇最简单,熬书几个月,终于编出简易的贪吃蛇了,VS2013
  10. 探秘RocketMQ源码——Series1:Producer视角看事务消息