動態改變EnterpriseLibary數據庫訪問鏈接字符串的三種方法


使用EnterpriseLibary做數據庫訪問底層是我一貫的做法,除了其能兼容多種數據庫,且使用其進行數據庫訪問,對各種數據庫操作均是透明的,基本不需要對特定的數據庫進行操作,編寫一次操作代碼,基本在各種數據庫都適用。對於一些特殊的數據庫,很多同行已經編寫出各種各樣的擴展類庫,直接適用即可。

言歸正傳,動態改變EnterpriseLibary數據庫訪問鏈接字符串一般在使用Access數據庫、Sqlite數據庫等文件式的數據庫比較常見,因為我們不知道客戶會把程序拷貝到哪里進行使用(即使是做了安裝包,這樣動態改變連接字符串的方式,也是一種很好的處理方式)。

1)第一種方式,使用前動態改變配置節點內容。

這種方式很常見,一般常用在Winform程序上,在使用程序訪問數據庫前,先根據當前的程序運行位置,修改配置項里面的內容,然后更新配置節點,從而達到可以應用最新配置信息的操作。

我們先來看看一個配置文件例子。

如果要修改更新其中的配置信息,具體代碼如下所示。

            string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}Database1.mdb;User ID=Admin;Jet OLEDB:Database Password=;", System.AppDomain.CurrentDomain.BaseDirectory);
            AppConfig config = new AppConfig();
            config.SetConnectionString("DataAccess", connectionString);

            //更新配置文件,以便起效
            ConfigurationManager.RefreshSection("dataConfiguration");
            ConfigurationManager.RefreshSection("connectionStrings");
            ConfigurationManager.RefreshSection("appSettings");

其中數據庫參數設置我封裝在了公用類庫的AppConfig配置類里面了,你也可以使用自己的操作進行修改。

這樣更新操作后,數據庫更新為正確的路徑地址,我們在EnterpriseLibary里面就不用再做任何操作,就能正常訪問操作數據庫了。

 

2)第二種方式,在EnterpriseLibrary里面對連接字符串進行動態修改。

有時候,我們會碰到另外一種情況,就是程序雖然是使用Access數據庫或者Sqlite數據庫,但是需要在Web端部署,有無更方便的修改配置參數方式呢。

除了上面的一種方式,還有一種方式是在EnterpriseLibrary里面修改Database對象的連接字符串。

首先我們在配置文件里面,相對路徑使用參數$Start$變量進行標識,使用連接字符串創建數據庫的時候,我們替換這個變量,從而達到修改數據庫字符串的目的。

然后我們定義一個創建EnterpriseLibrary的Database對象的方法,用來動態修改連接字符串。

        /// <summary>
        /// 根據配置數據庫配置名稱生成Database對象
        /// </summary>
        /// <returns></returns>
        protected override Database CreateDatabase()
        {
            Database db = null;
            if (string.IsNullOrEmpty(dbConfigName))
            {
                db = DatabaseFactory.CreateDatabase();
            }
            else
            {
                db = DatabaseFactory.CreateDatabase(dbConfigName);
            }

 DbConnectionStringBuilder sb = db.DbProviderFactory.CreateConnectionStringBuilder();
            sb.ConnectionString = GetConnectionString();
            GenericDatabase newDb = new GenericDatabase(sb.ToString(), db.DbProviderFactory);
            db = newDb;

            return db;
        }

        public string GetConnectionString()
        {
            AppConfig config = new AppConfig();
            string connectionString = config.GetConnectionString("DataAccess2");

            connectionString = connectionString.Replace("$Start$", AppDomain.CurrentDomain.BaseDirectory);
            return connectionString;
        }

上面紅色部分就是動態修改的核心所在,這樣我們封裝了一個CreateDatabase對象后,所有創建Database對象的操作,均使用這個方法即可。下面是一個Sqlite數據庫查找記錄的操作,調用例子如下所示。

        /// <summary>
        /// 查找記錄表中最舊的一條記錄
        /// </summary>
        /// <returns></returns>
        public override T FindFirst()
        {
            string sql = string.Format("Select {0} From {1} Order by {2} ASC LIMIT 1", selectedFields, tableName, GetSafeFileName(sortField));
            T entity = null;

            Database db = CreateDatabase();
            DbCommand command = db.GetSqlStringCommand(sql);

            using (IDataReader dr = db.ExecuteReader(command))
            {
                if (dr.Read())
                {
                    entity = DataReaderToEntity(dr);
                }
            }
            return entity;
        }

這樣操作是不是也很方便呢?以上就是我常用的兩種動態改變數據庫連接字符串的操作,希望對大家在處理同類型問題的時候,有所幫助。

3)第三種方式,使用|DataDirectory|代替運行目錄

之前在很多項目中運用了第二種方式,運行良好,不過發表文章的時候,有博友指出,還可以使用這種|DataDirectory|的方式,這個是內置的.net目錄,可以替代運行時刻的當前目錄,經過測試,效果非常不錯,因此也作為建議使用的方式。

使用這個|DataDirectory|關鍵字有一點值得注意的地方,就是如果開發Asp.net的Web應用,那么把數據庫放到App_Data目錄下,這是一個特殊的目錄;如果是開發Winform(類似我這樣的),就是把數據庫放到運行程序的根目錄即可,不需要在創建App_Data了,因為Winform里,這個不是特殊目錄,如果你創建了這樣的目錄,反而是畫蛇添足了。

使用這種方式,那么你構建的數據庫連接方式就如下所示。

Access數據庫的鏈接字符串:

connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ComponentData.mdb;User ID=Admin;Jet OLEDB:Database Password=;"

Sqlite的鏈接字符串:

connectionString="Data Source=|DataDirectory|\ComponentData.db;Version=3;"

再次感謝提出該思路的朋友!


免責聲明!

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



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