使用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;"
再次感謝提出該思路的朋友!