在上篇隨筆《winform開發框架之框架演化》中介紹了幾種winform開發框架,其中有對於離線式wcf開發框架的介紹,離線式的wcf開發框架 ,就是結合了傳統winform開發框架的資料訪問方式,又利用了wcf分布式資料獲取的特點,使得資料可以離線使用,在一種業務要求集中化,又要求不影響正常業務操作的應用系統場景下比較適合。本文主要介紹如何利用我的winform開發框架的整體思路,實現wcf開發框架的離線式的資料上傳、更新的同步操作。
下面我們來分析下這種離線式的wcf開發框架,需要做哪些準備工作,來實現框架的支撐。
這個是常見分布式系統的要求了,在一些普通的winform程式的資料庫中也比較常見,之所以把它作為第一條,雖然簡單,但是很必要,因為需要避免分布式的客戶端和服務端的資料衝突問題,特別在多個客戶端的情況下,對資料的唯一性要有好的控制性。
所以這也要求基礎的框架基類,能夠提供對整形、字元型的主鍵id的操作相容性,這在我的winform開發框架中,支援是比較好的。
在分布式的環境下,和服務端的環境不同,部署程式要求越簡單越好,太複雜的話,增加客戶端的使用的難度,會極大提高維護的成本,因此,一般客戶端會選用適應性比較好,又免安裝的資料庫,如sqlite就是乙個很好的單機版資料庫,還有access也是很不錯的,當然還有其他的一些資料庫,不過我覺得sqlite和access是比較好的備選方案。伺服器端的資料庫,則看業務支援和響應程度來決定,可以從一些對效能支援比較好的資料庫中選型,如大型一點的,可選擇oracle來做,其他的可以選擇sqlserver、mysql等資料庫。雖然這些資料庫部署比較麻煩一點,不過反正只有一台伺服器需要這種安裝部署,所以工作難度及工作量不會很大。
對多資料庫的支援,也要求我們的開發框架能夠很好相容,最好在資料庫操作層可以通過配置方式進行切換,即使資料庫變化為其他型別,也不需要改變整體的框架布局,甚至不用變化**即可實現自由切換,如資料庫框架可以設定如下。
對於上面幾種資料庫的支援,一般來說,需要增加不同資料庫型別的basedal,由於每個不同資料庫都需要擁有乙個basedal,那麼很多相同的操作**就會發生冗餘,因為大多數資料庫的基礎操作是一樣的,只有一部分比較特別,需要進行個性化處理,因此對資料訪問層進行優化設計,得到下面的設計圖,如下所示。
經過框架抽象,這個basedal類**很少,基本上通用的資料庫操作,已經放到了abstractbasedal超級基類進行封裝,即使對於一些不同資料庫操作不同,我們也盡可能抽象放到上面基類了,basedal只需要實現一些特殊的操作即可。
由於分布式,離線式的框架設計,要求我們客戶端自行記錄資料的變化情況,包括新增資料、修改資料和刪除資料,這樣不用每次同步的時候,把所有的資料庫記錄都遍歷一次,然後和伺服器記錄進行比較。這種記錄方式,可以極大提高客戶端資料上傳的效能和快捷性。因為我們對於很多表及記錄的資料庫,可能每次更新的只是一小部分,這樣設計,有利於我們更好地額處理客戶端資料上傳。
例如,下面的表,就是對於乙個客戶端上傳記錄表的設計,其中dept_id是用來記錄不同部門的表示,基本上每個客戶端,都有自己的乙個部門編號,防止資料發生衝突,也方便伺服器端的資料進行歸類查詢。
下面是一些實際業務產生的資料記錄,我們記錄部門id、表名(發生變化)、對應記錄的id(guid)、修改使用者、修改時間等資訊。
另外,我們還可以結合系統來記錄使用者登入資訊、使用者對記錄修改的日誌,以便我們對一些關鍵操作進行審計需要。資料庫設計如下所示。
對於上面的to_upload表,我們是把客戶端修改的資料記錄資訊,記錄到表裡面去,但是這些肯定是後台自動記錄的,而且這個操作是放到基模擬較合適,否則每次呼叫,不太方便,也比較冗餘。
放到基類的操作,我們需要設計一下,否則所有的表都會記錄,不管需不需要,這樣不可以的。
首先我們在基類basedal(對sqlite的資料庫基類),增加乙個變數來記錄是否資料庫訪問基類,需要記錄資料庫變化資訊。
protected對於具體業務物件的資料訪問,我的winform開發框架都有提供乙個對應的類來進行操作。bool islogtoupoad = false; //表示是否記錄變化
///為了要實現自動記錄資料庫變化資訊,我們需要在basedal裡面對插入、修改、刪除的操作進行特別的處理,過載基類的操作,增加相應的處理即可,如下**所示。///藥品資訊
/// public
class drugdetail : basedal, idrugdetail
}public drugdetail() : base("
m_drugdetail
","id")
#endregion
..........................................
private由於是上面的privateupdate和inser方法,是所有派生的更新、插入介面的最原始的函式,所有其他相關函式都會呼叫這兩個的基礎函式, 這樣就基本實現了資料庫記錄的變化記錄了。void addtoupload(string id, string targettable, system.data.common.dbtransaction trans, int
uploadtype)
public
override
bool privateupdate(object id, hashtable recordfield, string
targettable, dbtransaction trans)
return
result;
}public
override
bool insert(system.collections.hashtable recordfield, string
targettable, system.data.common.dbtransaction trans)
return
result;
}
變化記錄的上傳從操作,就是遍歷to_upload裡面的記錄,把它更新到伺服器上即可。
///為了實現資料上傳操作,我們把邏輯封裝在乙個函式裡面,這樣方便管理,也方便閱讀。///把本地變化的資料記錄,同步到伺服器上
/// ///
public
bool
syncall()
#region 顯示進度等處理
string tips = string.format("
正在同步表 ...
", toinfo.tablename);
int step = 0
;
if (total > 0
)
if (ondatadealed != null
)
i++;
if (toinfo == null || string
.isnullorempty(toinfo.tablename))
#endregion
}
#region 同步系統關鍵資料
if(success)
#endregion
return
true
; }
privatebool
dealdrugusedetail(touploadinfo toinfo)
);if(success)
}return
success;
}
privatevoid
dealinhospital()
);int i = 1
;
int total =list.count;
foreach (inhospitalinfo info in
list)
}
Winform開發框架之介紹
框架已經正式改名為 yeswin開發框架,最新資料請前往 yeswinform 簡介 yes快速開發平台框架 yesdotnet.com winform開發框架,儘量減少程式設計師在介面中的 量和工作量,model自動生成,介面以及控制項自動生成,簡單的邏輯自動生成。自動生成的介面已經實現簡單邏輯增...
Winform開發框架之資料曲線報表
在專案開發中,往往會碰到一些非常規的需求,每次碰到這種情況,都需要花費時間來整理自己的思路,然後參考網路上其他人的實現方式或者作法,有時候可以找到一些相同的模組進行改進即可符合需求,但往往很多是需要自己潛心研究,然後提煉優化,雖然探索過程還是比較開心,不過時間肯定是需要花不少的。我每次碰到這種情況,...
Winform開發框架之資料曲線報表
在專案開發中,往往會碰到一些非常規的需求,每次碰到這種情況,都需要花費時間來整理自己的思路,然後參考網路上其他人的實現方式或者作法,有時候可以找到一些相同的模組進行改進即可符合需求,但往往很多是需要自己潛心研究,然後提煉優化,雖然探索過程還是比較開心,不過時間肯定是需要花不少的。我每次碰到這種情況,...