打造 通用的 支持多数据库 操作的 DBHelper
生活随笔
收集整理的這篇文章主要介紹了
打造 通用的 支持多数据库 操作的 DBHelper
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
閑來無事,寫一個(gè)通用的直持多數(shù)據(jù)庫的DBHelper,支持單連接批量執(zhí)行SQL
因?yàn)橛昧薚ransactionScope所以請引用System.TransactionScope.dll
代碼尚未測試,請不要在生產(chǎn)環(huán)境中使用,后續(xù)會用測試好的代碼替換,并會持續(xù)支持,歡迎大家一起學(xué)習(xí)
歡迎加入 QQ群一起學(xué)習(xí)?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>/// 腳本參數(shù)集/// </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>/// 裝載參數(shù)/// </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>/// 執(zhí)行查詢/// </summary>/// <typeparam name="U"></typeparam>/// <param name="connectionString">連接字符串</param>/// <param name="commandText">查詢語句</param>/// <param name="parameters">查詢參數(shù)</param>/// <returns>數(shù)據(jù)集</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>/// 執(zhí)行查詢/// </summary>/// <param name="connectionString">連接字符串</param>/// <param name="commandType">腳本類型</param>/// <param name="commandText">執(zhí)行的腳本</param>/// <param name="parameters">執(zhí)行參數(shù)</param>/// <param name="behavior">查詢結(jié)果行為</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>/// 執(zhí)行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>/// 批量執(zhí)行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>/// 執(zhí)行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>/// 批量執(zhí)行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;}}}} }?后續(xù)會放出基于該類的SqlHelper
轉(zhuǎn)載于:https://www.cnblogs.com/bygrace/p/5960968.html
總結(jié)
以上是生活随笔為你收集整理的打造 通用的 支持多数据库 操作的 DBHelper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GIT本地操作
- 下一篇: 用辩证、动态的眼光看世界