[EnterpriseLibrary] DataAccess Block 讀取自訂.config 及 給予動態連線字串

本篇文章將透過程式設定 EnterpriseLibrary 下的 DataAccess Block
1.預設讀取web.config
2.讀取自行設定 myconnetion.config
3.動態連線字串傳入給 DataAccess Block

大家好,好久不見的Dotjum 技巧分享又來嘍~
今天要跟大家分享的是 EnterpriseLibrary 下的 DataAccess Block 。
微軟推出 EnterpriseLibrary  也出到 3.1 版本 http://msdn.microsoft.com/entlib/
但目前Dotjum用的是 January 2006的版本,EnterpriseLibrary  在 January 2006 有八大套件,
哪六大功能性套件呢?請看下圖

image
(該圖檔引用 Enterprise Library 2.0 模型程式設計 王寧疆老師  Enterprise Library 2.0 模型程式設計  投影片)
而Dotjum平常都有在使用 DataAccess 這塊,其他就慢慢在學習使用當中,
也希望能夠將每一個套件都寫幾篇教學文章分享給大家。
廢話了那麼多,趕快進入今天的正題,在使用  EnterpriseLibrary  DataAccess Block 讀取自訂的 .config 及自訂連線。
情境是這樣的,可能你今天會做一各專案,在  VS 2005 會開啟一個方案 下面有 ClassLibrary 及 WEB ,
所有跟資料庫的操作都會放在 ClassLibrary 中,WEB 專案將參考ClassLibrary1 專案的.dll
image 
情境說明後,開始來進入程式的部分。
一般來說,若你在 ClassLibray 的連線,EnterpriseLibrary   會自動找尋 Web專案下的 Web.Config 的連線字串。
1.預設讀取web.config 下的連線字串
web.config
 


    <appSettings/>
    <connectionStrings>
  <add name="NorthwindConnectionString"
 connectionString="Data Source=您的電腦\SQLEXPRESS;Initial Catalog=Northwind;
Integrated Security=True"
   providerName="System.Data.SqlClient" />

 </connectionStrings>

</configuration>


而在 ClassLibray 下的 DataAccess.cs 

 public class DataAccess
 {
         Database db;
        //這是一般的作法傳入連結字串所設定的名稱
       public DataAccess(string inConnetionName)
       {
           db = DatabaseFactory.CreateDatabase(inConnetionName); 
       }
      //這是要執行的Method Northwind 資料庫
        public int GetCustomersCount()
        {
            string inCity = "London";
            string strTSQL = "SELECT COUNT(*) FROM Customers WHERE City=@City";
            DbCommand Procdbcomm = db.GetSqlStringCommand(strTSQL);
            db.AddInParameter(Procdbcomm, "@City", DbType.String, inCity);
            int iCount = Convert.ToInt32(db.ExecuteScalar(Procdbcomm).ToString());
            return iCount;
        }
}

在 default.aspx.cs 下使用該方法

 protected void Button1_Click(object sender, EventArgs e)
    {
        //直接讀取往站內的 web.config
        ClassLibrary1.DataAccess da = new ClassLibrary1.DataAccess("NorthwindConnectionString");
        Response.Write(da.GetCustomersCount().ToString());
    }


在一般的狀況下,我們在 ClassLibrary1.DataAccess 初始化時,傳入我們在Web.config的連線字串,
在 dataAccess.cs 下的 DataBaseFactory.CreateDataBase 會讀取專按下的 Web.Config


那如果今天我們要將 .config 分離出來,將連線字串不放在預設的 web.config 該怎麼做呢?
2.讀取自訂的 .config
首先,我們先新增一個我們定義的 .config 檔
myConnetion.config

    <connectionStrings>         
        <add name="ConnectionString" 
             connectionString="Data Source=電腦名稱\SQLEXPRESS;
Initial Catalog=北風貿易;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>



而在 ClassLibray 下的 DataAccess.cs 這邊要特別處理
/// <summary>
/// 這是讀取自行定義的.config 
/// </summary>
/// <param name="inSettingFileName">自行定義的.config名稱</param>
/// <param name="inConnetionName">連線字串名稱</param>
public DataAccess(string inSettingFileName,string inConnetionName)
{
//這邊請使用 FileConfigurationSource 藍讀取你自行設定的 .config
     IConfigurationSource source = new FileConfigurationSource(inSettingFileName);
     DatabaseProviderFactory factory = new DatabaseProviderFactory(source);            
     db = factory.Create(inConnetionName);            
}
在 default.aspx.cs 下
protected void Button2_Click(object sender, EventArgs e)
{
//讀取自行設定連線的 myConnetion.config
ClassLibrary1.DataAccess da = 
new ClassLibrary1.DataAccess("myConnetion.config", "ConnectionString"); Response.Write(da.GetAuthorCount().ToString()); }

這邊只需要特別使用 FileConfigurationSource 就能夠讀取到自行定義.config 
那又如果今天,連線自動可能會依照某些狀況不會寫在 .config 必須動態產生時,
那該怎麼辦呢? 請看第三招
3.讀取動態連線字串

這邊就直接在 aspx.cs 下
protected void Button3_Click(object sender, EventArgs e)
    {
        //直接給予連線字串
        GenericDatabase db = 
new GenericDatabase(@"Data Source=電腦名稱\SQLEXPRESS
;Initial Catalog=Northwind;Integrated Security=True",
             System.Data.SqlClient.SqlClientFactory.Instance);

        string inCity = "Bracke";
        string strTSQL = "SELECT COUNT(*) FROM Customers WHERE City=@City";
        DbCommand Procdbcomm = db.GetSqlStringCommand(strTSQL);
        db.AddInParameter(Procdbcomm, "@City", DbType.String, inCity);
        int iCount = Convert.ToInt32(db.ExecuteScalar(Procdbcomm).ToString());
        Response.Write(iCount.ToString());
    }


這邊特別注意的是是使用 GenericDatabase  ,而在文件中寫到
GenericDatabase Constructor 要傳入兩個參數,
第一個是你的動態連線字串,第二個是資料庫的行別

C#

public GenericDatabase (
	string connectionString,
	DbProviderFactory dbProviderFactory
)

屬於 DbProviderFactory 繼承階層以下列表

摺疊影像繼承階層架構

System.Object
System.Data.Common.DbProviderFactory
System.Data.Odbc.OdbcFactory
System.Data.OleDb.OleDbFactory
System.Data.OracleClient.OracleClientFactory
System.Data.SqlClient.SqlClientFactory


所以,當您動態連結的字串非SQL的時候像是access,就可以使用OleDbFacory 。

        GenericDatabase db = new GenericDatabase(@"連線字串",
             System.Data.OleDb.OleDbFactory.Instance);

所以透過以上簡單小設定,就能夠讓你使用 EnterpriseLibrary DataAccess 更有彈性。
希望這篇教學可能讓你解決你使用上的困境,當然如果Dotjum學習的速度更快的話,
希望可以把其他的套件詳細的使用都能夠詳細的再寫幾篇Blog。

有任何意見等相關,歡迎透過討論方式一起來學習。

完整範例下載 Solution1.rar