星期六,補班。一回家先把一堆衣服洗了,手凍的不行但蠻有成就感的!
接著昨天的聊。
上篇說到‘父親’留下了點兒事情給‘兒子’去做,對,即使是‘兒子’去做,沒有現代化‘工具’
在現代社會哪那麼容易,所以工欲善其事,必先利其器,OK,我們就先談工具的做法。
今天要說的有兩個關係到資料庫的基礎類,DataAccess ,TableDataAccess<T, U> 。
第一個類很簡單,就是傳入一個串連串,再產生串連就好了:
public static class DataAccess
{
public static string ConnectionString;
public static OracleConnection GetConnection()
{
if (ConnectionString == null)
{
throw new ApplicationException("請提供一個資料庫連接字串");
}
return new OracleConnection(ConnectionString);
}
}
當然這樣的 DATAACCESS類寫法非常多,可按照自己的習慣去寫,例如可用單件模式去實現等 》》》,這個
類就說到這裡。
下面來說較為難的一種,TableDataAccess<T, U> ,為一個泛型類,其中,T 被約束為 TableItem,
U被約束為TableCollection<T>【T為TableItem】,不熟悉泛型和泛型約束的朋友可參考其他資料,我這裡
就不談了,OK,看看具體實現:
public abstract class TableDataAccess<T, U>
where T : TableItem
where U : TableCollection<T>
{}
這個抽象類別所做的事情就是 取資料和存資料,其實,它本身也只是對資料集的整理,真正的實現還是子類。
我們看下這麼去取資料:
public void GetData(U data)
{
// 清空已經存在的資料
data.Clear();
//我這裡以ORACLE為例,SQLSVR的話當然就是 SqlDataReader了,以下一樣。
// 獲得資料閱讀器.
OracleDataReader reader = GetReader();
while (reader.Read())
{
T item = GetItemFromReader(reader);
data.Add(item);
}
data.AcceptChanges();
reader.Close();
}
就是把取出來的資料添加到 tablecollection 中,這個tablecollection就是實體物件了,是在使用者端實現的,然後
使用者端把這個實體中的資料再存入資料庫中,這是以後講執行個體的時候要講到的問題。至於data.AcceptChanges()
看看前面講過的就明白了,就不再囉嗦了。
再看另外一個方法,存資料:
public void SaveData(U data)
{
OracleConnection conn = DataAccess.GetConnection();
conn.Open();
// 將每條資料分類,是新增,是刪除,還是修改
foreach (T item in data.AllItems())
{
OracleCommand cmd = null;
if (item.IsDeleted && !item.IsNew)
{
cmd = GetDeleteCommand(item, conn);
}
else if (item.IsNew && !item.IsDeleted)
{
cmd = GetInsertCommand(item, conn);
}
else if (item.IsDirty)
{
cmd = GetUpdateCommand(item, conn);
}
if (cmd != null)
{
cmd.ExecuteNonQuery();
}
}
conn.Close();
}
說到這裡,奇怪的是,其中幾個GetxxxCommand(item,conn)在哪兒實現呢?毋庸置疑,當然是在子類了:
protected abstract OracleDataReader GetReader();
protected abstract T GetItemFromReader(OracleDataReader reader);
protected abstract OracleCommand GetUpdateCommand(T item, OracleConnection conn);
protected abstract OracleCommand GetInsertCommand(T item, OracleConnection conn);
protected abstract OracleCommand GetDeleteCommand(T item, OracleConnection conn);
這應該是目前開發方式中的基本原則吧---設計與實現分離。
當然了,也可用介面(interface)來實現隔離,讀者不妨試試看看,我也來做做,到時候一起來看看,O(∩_∩)O哈哈~
OK, 到現在為止,所有基礎類就講完了,大家可建立一個表來實現下看,看到底是否【為所欲為】!
我將在下面一節,也是整個文章最後一節,來說明怎樣做一個執行個體。
今天就說到這裡吧,,大家可隨便發表看法,,方可共同進步啊!!呵呵。。。。