最近一邊參與公司的項目開發,一邊還肩負着基礎庫的創建和維護。真真切切的體會到寫框架的不容易,寫出好的,方便使用的框架更不容易,需要考慮的東西太多,需要掌握的東西太多。不過不要緊我們正在前進的道路上。同志們一起加油!
經過與DBA的溝通,他認為對存儲過程的封裝是有必要的,以他十幾年的經驗看,存儲過程后期的移植是必不可少的。現在的項目是用SQLSERVER2008開發的,后期可能會移植到ORACLE上去,那么對存儲過程的編寫DBA考慮很周全。但是對於程序員來說,經驗稍微豐富點的可能會通過某種工廠將具體對象脫耦,或者使用依賴倒置的原則來解決更換數據源問題。但是考慮到統一的使用方法,這里還是真的有必要進行封裝的。那么如何封裝?
Dictionary<string, object> parameter = new Dictionary<string, object>(); parameter.Add("PurchaseID", Purchase.TempSerialNo);//單據流水號 parameter.Add("WarehouseId", Purchase.InWarehouseID);//倉庫ID parameter.Add("UserID", Purchase.UserID);//操作ID parameter.Add("UserName", Purchase.UserName);//操作人名稱 parameter.Add("PurchaseDate", DBNull.Value);//采購日期 parameter.Add("BuyUserID", DBNull.Value);//采購人編號 parameter.Add("BuyUserName", DBNull.Value);//采購人名稱 parameter.Add("BuyDate", DBNull.Value);//采購日期 parameter.Add("Memo", Purchase.Memo);//備注說明 IDataParameter[] parameterDic = IDataParameterFactory.CreateDbDataParameter(parameter); List<IDataParameter> listparameter = IDataParameterHelper.IDataParameterArrayToList(parameterDic); listparameter.Add(WL.DAL.DAL_TB_WLPurchase.GetErrIDParametere()); using (Fast.Orm.IDataSourceOperation operation = Fast.Orm.IDataSourceOperationFactory.Create()) { operation.ExecuteNonQuery(CommandType.StoredProcedure, "prc_WLPurchaseTmpAdd", listparameter.ToArray()); if (listparameter[listparameter.Count - 1].Value.ToString() == "0") return true; return false; }
一般性的封裝基本都這樣或者在IDataParameterFactory.CreateDbDataParameter(Entity)中加入根據實體的屬性動態的創建IDataParameter[]對象,如果你的創建始終是使用反射的話那么將是不可取的。有興趣的朋友可以參見本人的另一篇文章“利用抽象、多態實現無反射的綠色環保ORM框架”對實體的使用如果不能擺脫反射,那么在以后的基礎庫擴展中將面臨着很多性能問題,這里需三思。
/// <summary> /// 存儲過程實體(參數信息類)基類 /// </summary> public abstract class BaseStoredprocedureObject : DictionaryBase { /// <summary> /// 受保護的字段-存儲過程名稱 /// </summary> protected string procedurename = string.Empty; /// <summary> /// 受保護的字段-命令參數集合 /// </summary> protected List<IDataParameter> parameterlist = new List<IDataParameter>(); /// <summary> /// 獲取命令參數集合 /// </summary> public List<IDataParameter> ParameterList { get { return parameterlist; } } /// <summary> /// 添加IDataParameter對象到基類parameterlist對象 /// </summary> public abstract void AddParameterToBaseParameterObject(); /// <summary> /// 獲取存儲過程名稱 /// </summary> public string ProcedureName { get { return procedurename; } } /// <summary> /// 獲取對應參數名稱的值 /// </summary> /// <param name="keyname">參數名稱</param> /// <returns>object:參數值</returns> public object this[string keyname] { get { return this.Dictionary[keyname]; } internal set { this.Dictionary[keyname] = value; } } /// <summary> /// 獲取所有參數信息 /// </summary> public IDictionary GetProcedureEntity { get { return this.Dictionary; } } /// <summary> /// 存儲過程返回的數據集 /// </summary> public DataTable Source { get; internal set; } }
using System; using System.Collections.Generic; using System.Text; using System.Data; using Fast.Orm; namespace Fast.WL.Parmeter { [Serializable()] public class Init_prc_WLOrderTmpAdd : BaseStoredprocedureObject { public Init_prc_WLOrderTmpAdd() { this.procedurename = "prc_WLOrderTmpAdd"; this.Dictionary.Add("OrderID", null); this.Dictionary.Add("StationID", null); this.Dictionary.Add("UserID", null); this.Dictionary.Add("UserName", null); this.Dictionary.Add("OrderDate", null); this.Dictionary.Add("DeliveryAddress", null); this.Dictionary.Add("OrderType", null); this.Dictionary.Add("APNumber", null); this.Dictionary.Add("Memo", null); this.Dictionary.Add("ErrID", DBNull.Value); } public override void AddParameterToBaseParameterObject() { base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "OrderID", base.Dictionary["OrderID"], ParameterDirection.Input, DbType.String, 14)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "StationID", base.Dictionary["StationID"], ParameterDirection.Input, DbType.String, 36)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "UserID", base.Dictionary["UserID"], ParameterDirection.Input, DbType.String, 36)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "UserName", base.Dictionary["UserName"], ParameterDirection.Input, DbType.String, 10)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "OrderDate", base.Dictionary["OrderDate"], ParameterDirection.Input, DbType.DateTime, 8)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "DeliveryAddress", base.Dictionary["DeliveryAddress"], ParameterDirection.Input, DbType.String, 50)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "OrderType", base.Dictionary["OrderType"], ParameterDirection.Input, DbType.Int16, 2)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "APNumber", base.Dictionary["APNumber"], ParameterDirection.Input, DbType.String, 20)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "Memo", base.Dictionary["Memo"], ParameterDirection.Input, DbType.String, 220)); base.parameterlist.Add(IDataParameterFactory.CreateDbDataParameter( "ErrID", base.Dictionary["ErrID"], ParameterDirection.Output, DbType.Int32, 4)); } } public class prc_WLOrderTmpAdd : Init_prc_WLOrderTmpAdd { public object OrderID { get { return this.Dictionary["OrderID"] as object; } set { this.Dictionary["OrderID"] = value; } } public object StationID { get { return this.Dictionary["StationID"] as object; } set { this.Dictionary["StationID"] = value; } } public object UserID { get { return this.Dictionary["UserID"] as object; } set { this.Dictionary["UserID"] = value; } } public object UserName { get { return this.Dictionary["UserName"] as object; } set { this.Dictionary["UserName"] = value; } } public object OrderDate { get { return this.Dictionary["OrderDate"] as object; } set { this.Dictionary["OrderDate"] = value; } } public object DeliveryAddress { get { return this.Dictionary["DeliveryAddress"] as object; } set { this.Dictionary["DeliveryAddress"] = value; } } public object OrderType { get { return this.Dictionary["OrderType"] as object; } set { this.Dictionary["OrderType"] = value; } } public object APNumber { get { return this.Dictionary["APNumber"] as object; } set { this.Dictionary["APNumber"] = value; } } public object Memo { get { return this.Dictionary["Memo"] as object; } set { this.Dictionary["Memo"] = value; } } public object ErrID { get { return this.Dictionary["ErrID"] as object; } set { this.Dictionary["ErrID"] = value; } } } }
在Init_prc_WLOrderTmpAdd構造函數中我們設置所有的參數名稱和默認的值,這里可以會是DbNull.Value。[王清培版權所有,轉載請給出署名]
prc_WLOrderTmpAdd ordertmp = new prc_WLOrderTmpAdd(); ordertmp.OrderID = order.OrderID;//訂單流水號 ordertmp.StationID = order.StationID;//站點ID ordertmp.UserID = order.UserID; ordertmp.UserName = order.UserName; ordertmp.OrderDate = DBNull.Value; ordertmp.DeliveryAddress = order.DeliveryAddress; ordertmp.OrderType = order.OrderType; ordertmp.APNumber = string.IsNullOrEmpty(order.APNumber) ? DBNull.Value : (object)order.APNumber; ordertmp.Memo = DBNull.Value;//備注 Fast.Orm.ProcedureHelper.ProcedureOperation<prc_WLOrderTmpAdd>(ordertmp); return int.Parse(ordertmp.ErrID.ToString()) == 0 ? true : false;
這樣保證我們寫的代碼都圍繞着數據實體來進行數據庫的操作。
有了專業的代碼生成器之后,一切就變的簡單多了,我們按照自己的要求設計開發代碼生成器來配合基礎框架的使用,那么我們的開發效率將大大提高了。