Winform開發框架之動態指定數據表


在Winform開發框架的應用中,大多數的時候,我們都是采用固定的表名作為操作數據表的對象,但有時候,有些特殊的需要,需要動態指定表的名稱,如表名稱可能和年份有關系或者和登錄用戶的身份有關系等等。本文介紹基於我的Winform開發框架,介紹如何動態構造表名,實現向不同表獲取數據的操作實現。

例如:數據庫中有一些客戶信息的表(Customer),按照年份存儲,都是Customer2012這樣格式的表,每次調用的時候需要告訴Customer業務對象實際上去訪問哪個Customer的表,比如Customer2012或者Customer2013,那么我們應該如何操作才能達到這種效果呢?

首先我們來了解下整個Winform開發框架的分層布局如下所示。其中界面層UI直接訪問BLL層,不需要通過網絡(WCF開發框架通過網絡訪問數據),其中公用輔助類庫Common層、實體類層可以在各個層中訪問,並把常用的權限管理、字典管理封裝為組件模塊,直接調用,底層則使用工廠方式,來支持各種不同的數據庫,其中UI層、BLL層、DAL層、實體層均使用繼承類方式實現最良好的封裝、最優的代碼設計。

業務訪問層的設計圖如下所示。

數據訪問層的設計如下所示。

由於基類的封裝良好性,以及利用泛型獲得強類型的操作體驗,減少出錯,更加方便易用,在擴展上也更加高效快捷。

綜上所述,為了實現動態表名的操作,我們只需要擴展三個類即可實現,第一個是BaseBLL業務層基類,提供給接口給界面進行調用;第二個是IBaseDAL,提供數據訪問層接口進行調用,第三個是在AbstractBaseDAL基類中實現修改數據表的接口即可。下面我們來看具體的代碼分析。

1)在BaseBLL增加InitTableName函數的實現。

    public class BaseBLL<T> where T : BaseEntity, new()
    {
        #region 構造函數

        private string dalName = "";
        protected IBaseDAL<T> baseDal = null;

        public BaseBLL() : this("")
        {
        }

        public BaseBLL(string dalName)
        {
            .......................
            
            baseDal = Reflect<IBaseDAL<T>>.Create(this.dalName, Assembly.GetExecutingAssembly().GetName().Name);
        } 

        #endregion        
        
        /// <summary>
        /// 初始化數據庫表名
        /// </summary>
        /// <param name="tableName">數據庫表名</param>
        public void InitTableName(string tableName)
        {
            baseDal.InitTableName(tableName);
        }
    }

2)在IBaseDAL中增加接口定義

    /// <summary>
    /// 數據訪問層接口
    /// </summary>
    public interface IBaseDAL<T> where T : BaseEntity
    {
        //其他接口定義
        .............................

        /// <summary>
        /// 初始化數據庫表名
        /// </summary>
        /// <param name="tableName">數據庫表名</param>
        void InitTableName(string tableName);
    }        

3)在AbstractBaseDAL數據訪問基類中實現InitTableName接口。

    /// <summary>
    /// 數據訪問層的基類
    /// </summary>
    public abstract class AbstractBaseDAL<T> where T : BaseEntity, new()
    {
        protected string tableName;//需要初始化的對象表名
        protected string primaryKey;//數據庫的主鍵字段名
        protected string sortField;//排序字段

        public AbstractBaseDAL()
        {}

        /// <summary>
        /// 指定表名以及主鍵,對基類進構造
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="primaryKey">表主鍵</param>
        public AbstractBaseDAL(string tableName, string primaryKey)
        {
            this.tableName = tableName;
            this.primaryKey = primaryKey;
            this.sortField = primaryKey;//默認為主鍵排序
        }
        
        
        //省略其他代碼
        ..............................

        /// <summary>
        /// 初始化數據庫表名
        /// </summary>
        /// <param name="tableName">數據庫表名</param>
        public void InitTableName(string tableName)
        {
            this.tableName = tableName;
        }
    }

4)界面層調用代碼

以數據字典操作為例,我們動態指定表名可以調用下面代碼,如下所示。

        private void btnTest_Click(object sender, EventArgs e)
        {
            BLLFactory<DictType>.Instance.InitTableName("tb_DictType");
            List<DictTypeInfo> list = BLLFactory<DictType>.Instance.GetAll();   
        }

以上就是動態表名在我的WInform開發框架中的實現擴展,雖然這個實現不算復雜,但是可以從中了解Winform開發框架的業務對象的調用過程,以及看到基類對象擴展的方便性和高效性。

由於底層的對象良好封裝,在我們實際開發過程中,大多數情況下,不用編寫額外的數據訪問代碼,對於界面及整體框架的代碼,也有代碼生成工具Database2Sharp能夠實現快速的框架代碼以及界面代碼(包括Winform、Web界面代碼)的生成,以此從根本上提高開發的效率,減少出錯的機會,統一整體框架的代碼風格,實現更加健壯的開發應用。

 

 

 


免責聲明!

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



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