午看到一個兄弟的文章,很辛苦的想實現不改程式碼只改組態來存取不同類型的資料庫,自己去實現工廠模式。精神可嘉,但是殊不知 C# 已經自己為不同類型資料庫的存取做了一個工廠。在這裡我就把使用工廠的例子貼出來供不知道的兄弟參考一下,高手們可以忽略了。
首先是組態檔:其中的 providerName 就是指定的不同資料庫類型
<connectionStrings>
<add name="..." connectionString=" ..." providerName="System.Data.OleDb" />
<add name="..." connectionString=" ..." providerName="System.Data.SqlClient" />
</connectionStrings>
下面看一下使用工廠的這個類別:
class DataBaseFac
{
private DbConnection cnn; // 抽象類型
private DbCommand cmd; // 抽象類型
private DbProviderFactory provider;
public DataBaseFac()
{
// 從組態檔中取出標示資料庫類型的字串
string providerName = ConfigurationManager.ConnectionStrings[1].ProviderName;
// 根據上一部的結果工廠建立一個對應的實例
provider = DbProviderFactories.GetFactory(providerName);
// 使用該實例就可以建立對應的 connection、command 和 adapter 物件了
// 除錯的時候可以看到這幾個物件都變成了相應於資料庫類型的
cnn = provider.CreateConnection();
cnn.ConnectionString = ConfigurationManager.ConnectionStrings[1].ConnectionString;
cmd = provider.CreateCommand();
cmd.Connection = cnn;
}
// 執行一次查詢,回傳資料表
public DataTable ExecuteQuery(string queryString)
{
DataTable result = new DataTable();
DbDataAdapter adapter = provider.CreateDataAdapter();
cmd.CommandType = CommandType.Text;
cmd.CommandText = queryString;
adapter.SelectCommand = cmd;
try
{
cnn.Open();
adapter.Fill(result);
}
catch
{
result = null;
}
finally
{
cnn.Close();
}
return result;
}
}
以上只是簡單的應用,並沒有做比較高級的封裝,只供不知道的兄弟參考。
順便說說,上午看到那個兄弟的文章用 switch case 語句來實現不同的建立 connection、command 和 adapter 的方法,然後說是工廠方法的實現。其實這是完全錯誤的,工廠模式的提出就是為了避免這麼多 switch case 造成的麻煩。以後有時間我會把幾個常用的模式的提出原因和應用場合總結一下用 C# 做幾個例子給不清楚的兄弟貼出來的。