我去年寫的數據訪問層(ADO篇)


這是我去年給公司寫的一個EF/ADO數據訪問層,可以實現對多種數據庫操作,代碼中包含了一般的查詢修改、事務和分布式事務等操作。

 

這篇文章我們來介紹一下ADO部分的處理。

下一篇EF篇(敬請關注)

 

ADO部分一般的查詢修改都比較簡單,這里就不詳細介紹了,只列出方法名(每個方法都進行了重載),方法如下:

View Code
public DataTable ExecuteDataTable(string commandText, CommandType commandType, string tableName, DbTransaction transaction, params DbParameter[] commandParameters);

public DbDataReader ExecuteDataReader(DbConnection connection, string commandText, CommandType commandType, params DbParameter[] commandParameters);

public DataSet ExecuteDataSet(string commandText, CommandType commandType, string datasetName, DbTransaction transaction, params DbParameter[] commandParameters);

public Int32 ExecuteNonQuery(string commandText, CommandType commandType, DbTransaction transaction, params DbParameter[] commandParameters);

public T ExecuteScalar<T>(string commandText, CommandType commandType, DbTransaction transaction, params DbParameter[] commandParameters);

public Object ExecuteScalar(string commandText, CommandType commandType, DbTransaction transaction, params DbParameter[] commandParameters);

public IList<Object> ExecuteScalar(string commandText, CommandType commandType, DbTransaction transaction, IList<DbParameter[]> commandParameters);

我們在這里詳細說一下事務處理的核心部分 :

通過Func和Action將業務處理層的函數傳遞到數據訪問層的事務中進行執行並返回結果,下面來看一下具體的實現代碼:

事務處理函數:

View Code
public List<TResult> ExecuteADOWithTransaction<T1, TResult>(params ADOTranParams<T1, TResult>[] adoParams)
{
DbConnection connection = GetConnection();
DbTransaction transaction = connection.BeginTransaction();
List<TResult> listObj = new List<TResult>();
try
{
if (adoParams == null)
{
throw new ArgumentNullException("adoParams is null");
}
Array.ForEach<ADOTranParams<T1, TResult>>(adoParams, t => listObj.Add(t.tupleParams.Item2(transaction, t.tupleParams.Item1)));
transaction.Commit();
}
catch (Exception m)
{
transaction.Rollback();

throw m;
}
finally
{
connection.Close();
}
return listObj;
}

ADOTranParams類的代碼:

View Code
public class ADOTranParams<TIn1, TOut>
{
/// <summary>
/// 初始化 <see cref="T:System.Object"/> 類的新實例。
/// </summary>
/// <remarks></remarks>
public ADOTranParams()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="ADOTranParams&lt;TIn1, TOut&gt;"/> class.
/// </summary>
/// <param name="transaction">The transaction.</param>
/// <param name="tIn1">The t in1.</param>
/// <param name="funcName">Name of the func.</param>
/// <remarks></remarks>
public ADOTranParams(DbTransaction transaction, TIn1 tIn1, Func<DbTransaction, TIn1, TOut> funcName)
{
this.tIn1 = tIn1;
this.funcName = funcName;
}

/// <summary>
/// Gets or sets the t in1.
/// </summary>
/// <value>The t in1.</value>
/// <remarks></remarks>
public TIn1 tIn1
{
get;
set;
}
/// <summary>
/// Gets or sets the name of the func.
/// </summary>
/// <value>The name of the func.</value>
/// <remarks></remarks>
public Func<DbTransaction, TIn1, TOut> funcName
{
get;
set;
}

/// <summary>
/// Gets the tuple params.
/// </summary>
/// <remarks></remarks>
internal Tuple<TIn1, Func<DbTransaction, TIn1, TOut>> tupleParams
{
get
{
return Tuple.Create(tIn1, funcName);
}
}
}

執行不帶參數的事務函數:

View Code
/// <summary>
/// ADO執行帶事物
/// </summary>
/// <param name="action">實現函數的事件委托</param>
/// <returns>返回事務中最后一個方法的返回值</returns>
/// <example>
/// eg. public void ActionRun()
/// {
/// Action&lt;DbTransaction&gt; a= ExcSqlTransDetail1;
/// a+= ExcSqlTransDetail2;
/// ... ...
/// ExecuteADOWithTransaction(a);
/// }
/// protected Object ExcSqlTransDetail1(DbTransaction transaction)
/// {
/// ... ...
/// return null;
/// }
///</example>
/// <remarks></remarks>
public Object ExecuteADOWithTransaction(Action<DbTransaction> action)
{
DbConnection connection = GetConnection();
DbTransaction transaction = connection.BeginTransaction();

Object rValue = null;
try
{
if (action == null)
{
throw new ArgumentNullException("action is null");
}
action(transaction);
transaction.Commit();
}
catch (Exception m)
{
transaction.Rollback();

throw m;
}
finally
{
connection.Close();
}
return rValue;
}

調用方法:

View Code
public List<String> ExecTran(Users user)
{
var t = new BTBaseDAL.ADOTranParams<Users, string>();
t.tIn1 = user;
t.funcName = InsertUserWithTran;

var t1 = new BTBaseDAL.ADOTranParams<Users, string>();
t1.tIn1 = user;
t1.funcName = UpdateUserWithTran;

return ExecuteADOWithTransaction(t, t1);
}

public string InsertUserWithTran(SqlTransaction tran, Users model)
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append(" INSERT INTO Users (UserName,Password,State,Creater_CreateDate,Creater_CreateUser,Creater_GUID,Creater_IsDelete) ");
strSQL.Append(" VALUES (@username,@password,@state,getdate(),@creater_createuser,newId(),0); select @@identity; ");

SqlParameter[] p ={
new SqlParameter("@username",SqlDbType.VarChar,50),
new SqlParameter("@password",SqlDbType.VarChar,50),
new SqlParameter("@state",SqlDbType.Int),
new SqlParameter("@creater_createuser",SqlDbType.VarChar,50)
};
p[0].Value = model.UserName;
p[1].Value = model.Password;
p[2].Value = model.State;
p[3].Value = model.Creater.CreateUser;

object rValue=ExecuteScalar(strSQL.ToString(), CommandType.Text, tran, p);
return "InsertUserWithTran UserId:" + rValue;
}
public string UpdateUserWithTran(SqlTransaction tran, Users model)
{

StringBuilder strSQL = new StringBuilder();
strSQL.Append(" UPDATE Users ");
strSQL.Append(" SET UserName = @username,Email =@email, ");
strSQL.Append(" Password = @password,State = @state, ");
strSQL.Append(" Creater_CreateUser = @creater_createuser");
strSQL.Append(" WHERE UserId=(SELECT top 1 UserId FROM Users ORDER BY UserId desc) ");

SqlParameter[] p ={
new SqlParameter("@username",SqlDbType.VarChar,50),
new SqlParameter("@password",SqlDbType.VarChar,50),
new SqlParameter("@state",SqlDbType.Int),
new SqlParameter("@creater_createuser",SqlDbType.VarChar,50),
new SqlParameter("@email",SqlDbType.VarChar,50)
};
p[0].Value = model.UserName;
p[1].Value = model.Password;
p[2].Value = model.State;
p[3].Value = model.Creater.CreateUser;
p[4].Value = "UpdateUserWithTran@bt.com";

ExecuteScalar(strSQL.ToString(), CommandType.Text,tran, p);
return "UpdateUserWithTran";
}

 

分布式事務更加簡單,直接看代碼(要使用分布式事務,請開啟MSDTC服務):

View Code
/// <summary>
/// Scopes the trans action.
/// </summary>
/// <param name="action">The action.</param>
/// <remarks></remarks>
public void ScopeTransAction(Action action)
{
using (var scope = new TransactionScope())
{
try
{
action();
scope.Complete();
}
catch (Exception s)
{
throw s;
}
}
}

文章出處:http://www.cnblogs.com/wmlunge/archive/2012/02/03/2336665.html

轉載請留下原文地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM