最近一邊參與公司的項目開發,一邊還肩負着基礎庫的創建和維護。真真切切的體會到寫框架的不容易,寫出好的,方便使用的框架更不容易,需要考慮的東西太多,需要掌握的東西太多。不過不要緊我們正在前進的道路上。同志們一起加油!
經過與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;
這樣保證我們寫的代碼都圍繞着數據實體來進行數據庫的操作。

有了專業的代碼生成器之后,一切就變的簡單多了,我們按照自己的要求設計開發代碼生成器來配合基礎框架的使用,那么我們的開發效率將大大提高了。
