資料介面實作類別的構建
針對用戶端的需求,在介面實作類別的操作大體分為兩個部分:事務相關操作和資料維護的相關操作。
class ReservationRemoteServiceImpl : MarshalByRefObject, IReservationRemoteService { private static List<Reservation> list;//儲存所有的關於Flight的資訊 private Hashtable TransactionBackupHashTable;//Key為tansaction 的編號,value就是list private Boolean m_hasControlled = false;//沒人去佔領這個資料類 public Boolean hasControlled { get { return m_hasControlled; } set { m_hasControlled = value; } }
介面實作類別的資料聲明結構
在介面實作類別中,需要暴露給用戶端的用public標示,其他的用private標示,這樣很好的保護了介面實作類別的內部結構,提高了代碼的安全性。
通過使用泛型類List<T>來儲存資料實體,而Hashtable則使用其key和Value這一特性,來備份資料集合,此次設計中key為事務編號,而List<T>則相應儲存到Value中去,不僅方便儲存而且方便尋找。
#region 事務的相關操作 /// <summary> /// 開始一個事務 /// </summary> /// <param name="xid"></param> public void BeginTransaction(String xid) { if (!TransactionBackupHashTable.ContainsKey(xid))//如果不包含該ID下的事務,則備份 Backup(xid); } /// <summary> /// 提交事務 /// </summary> /// <param name="xid"></param> public void CommitTransaction(String xid) { if (TransactionBackupHashTable.ContainsKey(xid))//如果包含該ID下的事務 Override(xid); } /// <summary> /// 復原事務 /// </summary> /// <param name="xid"></param> public void RollBack(String xid) { if (TransactionBackupHashTable.ContainsKey(xid))//如果包含該ID下的事務 Recover(xid); } /// <summary> /// 備份資料,且為每一個事務進行備份 /// </summary> /// <param name="xid">事務編號</param> private void Backup(String xid) { TransactionBackupHashTable.Add(xid, list); } /// <summary> /// 根據事務的編號恢複資料 /// </summary> /// <param name="xid"></param> private void Recover(String xid) { list = (List<Reservation>)TransactionBackupHashTable[xid]; } /// <summary> /// 如果執行成功,根據事務的編號進行覆蓋 /// </summary> /// <param name="xid"></param> private void Override(String xid) { TransactionBackupHashTable.Clear(); } #endregion
相關事務操作的方法實現
本次設計只是實現了資料集合的簡單增刪改查等操作,具體方法實現如下:
public Reservation searchReservation(String CustName)//搜尋客戶的預訂資訊 { for (int i = 0; i < list.Count; i++)//遍曆所有car中的資料 if (list[i].CustName == CustName) //搜尋到需要的資料 { return list[i]; } return null; }
尋找方法的實現
/// <summary> /// 插入新的資料 /// </summary> /// <param name="locationString">地名</param> /// <param name="price">價格</param> /// <param name="numRooms">汽車數目</param> /// <returns></returns> public Boolean insertCar(String locationString, int price, int numCars) { for (int i = 0; i < listCar.Count; i++)//遍曆所有hotel中的資料 if (listCar[i].location == locationString) //搜尋到需要的資料 { return false;//有重複則撤銷此次操作 } Car enetity = new Car(); enetity.location = locationString; enetity.price = price; enetity.numCars = numCars; enetity.numAvail = 0; listCar.Add(enetity); return true; }
插入方法的實現
插入的方法首先需要遍曆List<T>,查看是否有重複的資料主關鍵字,如果已經存在則返回插入失敗,不能進行資料插入。通過建立新的資料類型並插入到List<T>中來完成資料的添加。
/// <summary> /// 根據地名刪除汽車的相關資訊 /// </summary> /// <param name="locationString"></param> /// <returns></returns> public Boolean deleteCar(String locationString) { for (int i = 0; i < listCar.Count; i++)//遍曆所有Car中的資料 if (listCar[i].location == locationString) //搜尋到需要的資料 { listCar.RemoveAt(i); return true;//刪除成功 } return false;//沒有找到,刪除失敗 }
資料的刪除結構
刪除操作也是通過迴圈遍曆List<T>來尋找對象資料欄位相等的欄位來完成刪除的。
//建立唯一的索引值 格式為:001,002,003 public String GenerateID() { String idString = null; if (list.Count + 1 < 10) idString = "00"+(list.Count + 1).ToString(); else if (list.Count + 1 < 100 && list.Count + 1>=10) idString = "0" + (list.Count + 1).ToString(); else idString = (list.Count + 1).ToString(); int flag = 1;//標誌位 int increment = list.Count + 1;//索引值建立的原始量 while (true) { for (int i = 0; i < list.Count; i++) if (list[i].resvKey == idString) { flag = 0;//搜尋到了相同索引值的資料 break; } if (flag == 0) { //如果搜尋到了相同索引值的資料,則需要重新計算索引值 increment += 1; if (increment + 1 < 10) idString = "00" + (increment + 1).ToString(); else if (list.Count + 1 < 100 && list.Count + 1 >= 10) idString = "0" + (increment + 1).ToString(); else idString = (increment + 1).ToString(); } else//索引值建立沒有產生重複跳出 break; flag = 1;//還原 } return idString; }
產生資料主關鍵字的方法結構
在某些表中,資料需要主關鍵字來維護,而主關鍵字的值通過客戶自己來添加很可能會造成關鍵字重複,破壞資料唯一性。通過建立一個主關鍵字編號產生函數來建立主關鍵字,則不會產生重複資料。具體實現過程如下:
本次設計的主關鍵字格式為三位元字,不足三位的前面補零,例如6號表示為006,17號表示為017。本次設計的基本原則就是遞增式的增加,初始化的時候首先按照資料集合中的集合總數加1改編為資料主關鍵字,如果在資料庫中已經存在,那麼把把數值加1再次改變成標準格式到資料集合中尋找,如此直到迴圈一遍後都不會產生重複,那麼這個就為合法的主關鍵字。