日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

打造 通用的 支持多数据库 操作的 DBHelper

發布時間:2024/8/26 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 打造 通用的 支持多数据库 操作的 DBHelper 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閑來無事,寫一個通用的直持多數據庫的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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。