機房收費系統之組合查詢的發展過程
下面說下我的組合查詢吧。
在組合查詢這,最早的想法是用structure,因為印象中有一種型別,是可以用int型別來訪問的,可是做的時候發現不是structure,通過在網上查詢,找到了應該是Enum型別。
在機房收費系統中,一共有四個組合查詢的窗體。這四個窗體在外觀上都一樣,所以用窗體之間的繼承是沒的說的。
但是繼承後,發現子窗體的按鈕的單擊事件不執行,執行的是父類的單擊事件。而且如果子類方法後面加上handle btnQuery.Click後會提示錯誤。後來一想,發現自己好糊塗。然後將父類單擊事件的函式改為了Overridable(虛方法),在子類重寫後問題便解決了。
通過繼承,我省去了複製貼上那些對輸入判斷的程式碼,在引數填充上,也省了好多事。下面我就說下我是怎麼實現不論怎樣填寫條件,只傳送三個引數,而且沒有select判斷,由於我的Relation預設是and關係,所以只有Relation用了一個if語句來判斷是不是或關係,在只有一個條件時,那麼就將三個引數賦相同的值,也就是對三個相同的條件查詢and關係。這樣做的好處就是避免了使用判斷語句來進行拼加字串,在儲存過程中直接傳入引數即可。
其次,對於每個組合查詢對應的表所用到的欄位,我建了一個列舉型別,列舉型別包含的欄位的順序,和對應的組合框的SelectIndex處所對應的text對應。將欄位名(列舉型別)、操作符,要查詢的內容,組合關係分別作為成員建立一個類。這樣就有四個類,在四個類中,都重寫了New函式賦初值。例:
對於賦初值這件事,也是我為什麼棄structure而用class。對於structure,我印象中是可以賦初值的,可是當我賦初值時,總是提示錯誤。通過查詢,structure有一個沒有引數的建構函式,但是不能夠重寫(這個是msdn上說的,但是我查的資料中,大多都是說的可以重寫,應該是在.Net中改了吧。這個我也沒有太深究下圖中第一個是網上搜的資料,第二個是msdn中說的,二者截然相反。。。)
由於這四個組合查詢對應的類只有欄位名是不一樣的,而且都用了Fill函式對每個成員賦值,所以我採用了模板方法模式(在前面文章有提到)
我的組合查詢這塊的發展歷程差不多就是這樣子,下篇我說下在這個過程中遇到的傳參問題。