資料|資料庫
(一). 序幕
1.在實際的軟體開發中大部分都是團隊合作開發的,經常會出現這種情況,一個程式員只設計好資料庫,由另一個程式員寫程式.這就出現一個問題. 設計資料庫的程式員 設計資料庫欄位名稱命名習慣 與 寫程式碼程式員資料庫命名習慣有些不同. 例如: 資料庫程式員對 客戶名稱習慣命名"CustomerName" ,而寫程式代碼程式員習慣命名"CusName",這樣,寫程式代碼程式員在使用時,可能會大量使用類似:DataSet.Row[0]["CusName"],這樣在更新時就會報錯,如果大量出現這種情況的話,不但增加開發時修改BUG所耗時間,而且更重要的是會使整個項目各字碼頁面很難統一.
2.可以實現用戶端命名不受資料庫的約束. 例如資料庫中兩個表中的兩個名稱欄位分別為: CustomerName和ProjectName; 用戶端在相關介面,命名欄位時沒必要知道是哪個表中欄位的名稱,直接寫Name就可以了.
此文章就是解決上面兩點的要求.
(二). 解決方案
1.
其實SqlDataAdapter就已經實現此功能了. 它可以實現列映射,即將資料庫的列程式員自訂的列對應起來. 舉例說明:
設有個客戶表 Customer ,下面將對其內欄位進行映射,具體 代碼如下:
SqlDataAdapter myAdapter = new DqlDataAdapter();
DataTableMapping myMapping = new DataTableMapping();
myMapping = myAdapter.TableMappings.Add("Customer","Customer"); //告訴橋接器並添加映射對象
myMapping.ColumnMappings.Add("CustomerID","id"); //實際資料庫中欄位名為: CustomerID, 在實際 //對其操作時可以用ID欄位名稱. 例如:
// ds.Table["Customer"].Row[0]["id"]; //就表示客戶編碼列
myMapping.ColumnMappings.Add("CustomerName","name");
myMapping.ColumnMappings.Add("CustomerEmail","email");
myAdapter.Fill(ds,"Customer");
以上在使用時只需用映射後的操作就可以啦. 映射後的這段名稱可以自訂. SqlDataAdapter會將它們
對應起來,即將它們看作是同一列.
2 .解決網站統一問題 :
a.
假設在十個頁面中都用了代碼:
ds.Table["Customer"].Row[0]["CustomerName"];
現在由於某原因,要修改資料庫表欄位,需要將物理資料庫中的欄位:CustomerName改為: CusName基於現在的情況,還要到這十個頁面中去,找出所有的:
ds.Table["Customer"].Row[0]["CustomerName"];
並將其改為: ds.Table["Customer"].Row[0]["CusName"];
呵,就改一個欄位就帶來這麼多麻煩,如果改好多個表的多個欄位的話呢,時間消耗多少和維護難易程度就可想而知了. 下面就解決這個問題.
b.
定義一個類,並繼承DataSet. 代碼如下:
public Class Customer : DataSet
{
public Enum Field
{
ID = 0; //這些列與 DataSet內部表獲得資料後實際欄位名稱對應要正確. 這裡自己控制
Name = 1;
Email = 2;
Password = 3;
}
}
OK, 最後一步了,使用方法是這樣的:
ds.Table["Customer"].Row[0][Customer.Field.ID]; //取某列值
比起: ds.Table["Customer"].Row[0]["CustomerID"];
方便多了吧?
這樣,如果物理資料庫欄位怎麼修改,程式代碼根本不用修改(連這個類本身也不用修改).
謝謝閱讀!