代碼說明:
1.加了一個屬性(Property)SqlTrans,並且每個ExecuteNonQuery執行前都加了判斷是否以事務方式執行。這樣做是為後面從上下文中取事務做准備。
2.類繼承了ContextBoundObject,注意,是必須的,MSDN是這樣描述的:定義所有上下文綁定類的基類。
3.TransactionAop將在後面給出。
UserInfoAction.cs
[Transaction]
public class UserInfoAction : SqlDAL
{
[TransactionMethod]
public void Add(UserInfo user)
{
StringBuilder sb = new StringBuilder();
sb.Append("UPDATE [UserInfo] SET Password='");
sb.Append(user.PassWord);
sb.Append("' WHERE UID=");
sb.Append(user.UID);
ExecuteNonQuery(sql);
}
}
代碼說明:
1.很簡潔、非侵入式、很少改動、非常方便(想要事務就加2個標記,不想要就去掉)。
2.兩個Attribute後面將給出。
/// <summary>
/// 標注類某方法內所有數據庫操作加入事務控制
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class TransactionAttribute : ContextAttribute, IContributeObjectSink
{
/// <summary>
/// 標注類某方法內所有數據庫操作加入事務控制,請使用TransactionMethodAttribute同時標注
/// </summary>
public TransactionAttribute()
: base("Transaction")
{ }
public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink next)
{
return new TransactionAop(next);
}
}
/// <summary>
/// 標示方法內所有數據庫操作加入事務控制
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public sealed class TransactionMethodAttribute : Attribute
{
/// <summary>
/// 標示方法內所有數據庫操作加入事務控制
/// </summary>
public TransactionMethodAttribute()
{
}
}