打造 通用的 支持多数据库 操作的 DBHelper
2016-10-14 16:25
218 查看
闲来无事,写一个通用的直持多数据库的DBHelper,支持单连接批量执行SQL
因为用了TransactionScope所以请引用System.TransactionScope.dll
代码尚未测试,请不要在生产环境中使用,后续会用测试好的代码替换,并会持续支持,欢迎大家一起学习
欢迎加入 QQ群一起学习 254082423
废话不多说直接上代码
后续会放出基于该类的SqlHelper
因为用了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
相关文章推荐
- 通用数据库操作辅助类DbHelper
- 一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、Access、SQLITE
- 通用数据库操作辅助类DbHelper
- 通用数据库操作辅助类DbHelper
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(四)
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(二)
- Hibernate编写通用数据库操作代码
- Hibernate编写通用数据库操作代码
- 利用数据库,生成一个.net 调用的类文件(只支持对一个表操作的类)
- Hibernate编写通用数据库操作代码演示
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(三)
- 自己动手,打造数据库通用查询控件(using c#)
- DbHelperV2 - Teddy的通用数据库访问组件设计和思考
- 一个数据库操作通用类库
- Hibernate通用数据库操作代码
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(四)
- 数据库操作通用代码!
- 利用Hibernate编写通用的数据库操作代码
- 数据库通用操作
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)(一)