.NET重構(四):窗體繼承+模板方法,完美實現組合查詢

導讀:在機房重構中,有好些個查詢都是大同小異,最為顯著的就是組合查詢了。怎樣給自己省事兒,相同的東西能不能重復利用,就成了一個現實的問題。第一遍做機房的時候,使用的更多的是:復制+粘貼。學習了設計模式后,可以用模板方法解決。這篇文章,就通過窗體繼承和模板方法,實現組合查詢。


觀點:組合查詢在機房中有3中情況,其實,組合查詢完全可以看到是一種查詢情況。


一、窗體繼承的使用


1,首先建立一個父窗體

2,添加一個新項

3,選擇繼承窗體

4,確定后,一個新的繼承窗體就好了。

二、模板方法的使用


備注:定義一個組合查詢的實體,方便傳參

1,首先在U層寫入基礎方法和傳參

<span style="font-size:18px;">Public Class FrmGroupQueryPublic enGroupQuery As New Model.GroupQueryM  '定義一個實體參數Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles btnQuery.Click'第一行組合關系為空If cmbRelation1.Text = "" Then'判斷第一行控件內容是否為空If cmbField1.Text = "" ThenMsgBox("請輸入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("請輸入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("請輸入要查詢的內容")End IfEnd If' 當第一個組合關系不為空時  If cmbRelation1.Text <> "" ThenIf cmbField1.Text = "" ThenMsgBox("請輸入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("請輸入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("請輸入要查詢的內容")ElseIf cmbField2.Text = "" ThenMsgBox("請輸入字段名")ElseIf cmbOperation2.Text = "" ThenMsgBox("請輸入操作符")ElseIf txtContent2.Text = "" ThenMsgBox("請輸入要查詢的內容")End IfEnd If' 當第二個組合關系不為空時  If cmbRelation2.Text <> "" ThenIf cmbField1.Text = "" ThenMsgBox("請輸入字段名")ElseIf cmbOperation1.Text = "" ThenMsgBox("請輸入操作符")ElseIf txtContent1.Text = "" ThenMsgBox("請輸入要查詢的內容")ElseIf cmbField2.Text = "" ThenMsgBox("請輸入字段名")ElseIf cmbOperation2.Text = "" ThenMsgBox("請輸入操作符")ElseIf txtContent2.Text = "" ThenMsgBox("請輸入要查詢的內容")ElseIf cmbField3.Text = "" ThenMsgBox("請輸入字段名")ElseIf cmbOperation3.Text = "" ThenMsgBox("請輸入操作符")ElseIf txtContent3.Text = "" ThenMsgBox("請輸入要查詢的內容")End IfEnd If'給實體層傳參Dim enGroupQuery As New Model.GroupQueryMenGroupQuery._field1 = GetDBName(cmbField1.Text.Trim())enGroupQuery._field2 = GetDBName(cmbField2.Text.Trim())enGroupQuery._field3 = GetDBName(cmbField3.Text.Trim())enGroupQuery._operate1 = cmbOperation1.Text.Trim()enGroupQuery._operate2 = cmbOperation2.Text.Trim()enGroupQuery._operate3 = cmbOperation3.Text.Trim()enGroupQuery._content1 = txtContent1.Text.Trim()enGroupQuery._content2 = txtContent2.Text.Trim()enGroupQuery._content3 = txtContent3.Text.Trim()enGroupQuery._relation1 = GetDBName(cmbRelation1.Text.Trim())enGroupQuery._relation2 = GetDBName(cmbRelation2.Text.Trim())enGroupQuery.GetTable = GetTable() '通過函數的返回值給參數賦值'給B層GroupQuery方法傳遞參數Dim FGroupQuery As New Facade.GroupQuertFADim table As DataTabletable = FGroupQuery.GroupQuery(enGroupQuery)If table.Rows.Count = 0 ThenMsgBox("沒有記錄,請重新設置查詢條件", vbOKOnly, vbExclamation)DataGridView1.DataSource = NothingElseDataGridView1.DataSource = FGroupQuery.GroupQuery(enGroupQuery)End IfEnd Sub' 定義虛函數GetDBName,獲取不同數據庫的字段名  Protected Overridable Function GetDBName(ByVal control As String) As StringReturn ""End Function' 定義虛函數GetDBName,獲取不同數據庫的表名  Protected Overridable Function GetTable() As StringReturn ""End FunctionPrivate Sub Button2_Click_1(sender As Object, e As EventArgs) Handles btnExit.ClickMe.Close()End Sub'組合關系一不為空后,顯示第二行查詢條件Private Sub cmbRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation1.SelectedIndexChangedcmbField2.Enabled = TruecmbOperation2.Enabled = TruecmbRelation2.Enabled = TruetxtContent2.Enabled = TrueEnd Sub'組合關系二不為空后,顯示第三行查詢條件Private Sub cmbRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbRelation2.SelectedIndexChangedcmbField3.Enabled = TruecmbOperation3.Enabled = TruetxtContent3.Enabled = TrueEnd SubEnd Class</span>



 
 
 

2,在B層,對D層數據庫的查詢結果做出處理

<span style="font-size:18px;">Imports Charge.IDAL
Imports Charge.Model
Public Class GroupQueryBLL''' <summary>''' 根據組合查詢D層的返回結果,判斷是否有值''' </summary>''' <param name="enGroupQuery"></param>''' <returns>沒有值,不返回任何東西,有,就返回信息</returns>''' <remarks></remarks>Public Function GroupQueryStudent(ByVal enGroupQuery As Model.GroupQueryM) As DataTableDim factory As New Factory.CreateFactoryDim IGroupQuery As IGroupQuery = factory.CreateGroupQueryDim table As DataTable = IGroupQuery.GroupQuery(enGroupQuery)'檢查D層返回的數據表中是否有數據If table.Rows.Count = 0 ThenReturn NothingElseReturn tableEnd IfEnd Function
End Class</span>


3,在D層對數據進行查詢

<span style="font-size:18px;">/**********************************************
'類名:SQLGroupQuery
'命名空間:ChargeDAL
'創建時間:2015/1/5 20:58:39
'創建人:HXX
'修改時間:
'修改人:
'版本號:4.0.30319.18449
'說明:實現組合條件的
'版權:HHX
'/**********************************************
Imports System.Data.SqlClient
Imports System.Data
Imports ChargePublic Class SQLGroupQuery : Implements IDAL.IGroupQuery''' <summary>''' 根據設置的條件,進行信息查詢''' </summary>''' <param name="enGroupQuery"></param>''' <returns>返回查詢結果信息的集合</returns>Public Function GroupQuery(enGroupQuery As Model.GroupQueryM) As DataTable Implements IDAL.IGroupQuery.GroupQueryDim strSQL As String = "QueryGroup" '調用存儲過程  Dim prams As SqlParameter() = {New SqlParameter("@cmbField1", enGroupQuery._field1),New SqlParameter("@cmbField2", enGroupQuery._field2),New SqlParameter("@cmbField3", enGroupQuery._field3),New SqlParameter("@cmbOperation1", enGroupQuery._operate1),New SqlParameter("@cmbOperation2", enGroupQuery._operate2),New SqlParameter("@cmbOperation3", enGroupQuery._operate3),New SqlParameter("@txtContent1", enGroupQuery._content1),New SqlParameter("@txtContent2", enGroupQuery._content2),New SqlParameter("@txtContent3", enGroupQuery._content3),New SqlParameter("@cmbRelation1", enGroupQuery._relation1),New SqlParameter("@cmbRelation2", enGroupQuery._relation2),New SqlParameter("@tableName", enGroupQuery.GetTable)} '設置參數Dim MyHelper As New SqlHelperDim table As New DataTabletable = MyHelper.ExecSelect(strSQL, CommandType.StoredProcedure, prams)Return tableEnd Function
End Class</span>

三、在繼承窗體中的應用


在繼承窗體中,需要重寫模板父窗體中的方法,關鍵點有:字段的轉換,數據表的返回。

<span style="font-size:18px;">  Private Sub FrmOperateWorkLog_Activated(sender As Object, e As EventArgs) Handles Me.Activated'避免一個窗體多次打開,或者打開多個操作窗體Dim frm As Form'遍歷打開了的每一個窗體For Each frm In Application.OpenForms'如果當前窗體不是主窗體或者沒有被打開過If frm.Name <> Me.Name And frm.Name <> FrmMain.Name And frm.Name <> FrmLine.Name Then'其他打開的窗體最小化frm.WindowState = 1End IfNextEnd SubPrivate Sub FrmMaintainInfo_Load(sender As Object, e As EventArgs) Handles MyBase.Load'給字段賦值cmbField1.Items.AddRange({"教師", "注冊日期", "注冊時間", "注銷日期", "注銷時間", "機器名"})cmbField2.Items.AddRange({"教師", "注冊日期", "注冊時間", "注銷日期", "注銷時間", "機器名"})cmbField3.Items.AddRange({"教師", "注冊日期", "注冊時間", "注銷日期", "注銷時間", "機器名"})cmbOperation1.Items.AddRange({"=", "<", ">", "<>"})cmbOperation2.Items.AddRange({"=", "<", ">", "<>"})cmbOperation3.Items.AddRange({"=", "<", ">", "<>"})cmbRelation1.Items.AddRange({"與", "或"})cmbRelation2.Items.AddRange({"與", "或"})End Sub'重寫獲得表名方法Protected Overrides Function GetTable() As StringenGroupQuery.GetTable = "TC_WorkLogInfo"Return enGroupQuery.GetTable()End Function'重寫轉換成數據庫字段方法Protected Overrides Function GetDBName(control As String) As StringSelect Case (control)Case "教師"Return "UserID"Case "注冊時間"Return "OnTime"Case "注冊日期"Return "OnDate"Case "注銷時間"Return "OffTime"Case "注銷日期"Return "OffDate"Case "機器名"Return "Computer"Case "或"Return "or"Case "與"Return "and"Case ElseReturn ""End SelectEnd Function
End Class
</span>


到這里,利用窗體繼承和模板方法進行組合查詢就算是實現了。


四、應用說明
1,這里的返回類型都是DataTable,如果將其換為List,則就沒有這么簡單了。還需要多寫一步(存儲過程中),就像返回查詢表格的參數一樣,將查詢表格的參數寫到List中的表。
2,這里D層的查詢是通過調用的存儲過程,對存儲過程的使用和理解,將在下一篇博客中詳細說明。不過,在這里可以替換成一種類型,就像是第一次做機房時那樣。例(第一次機房中):

<span style="font-size:18px;">txtSQL = txtSQL & tiaojian(Trim(cobozd1(0).Text)) & Trim(cobocz1(0).Text) & "'" & Trim(txtnr1.Text) & "'" _& " and " _& tiaojian(Trim(cobozd1(1).Text)) & Trim(cobocz1(1).Text) & " '" & Trim(txtnr2.Text) & "'" _& " and " _& tiaojian(Trim(cobozd1(2).Text)) & Trim(cobocz1(2).Text) & " '" & Trim(txtnr3.Text) & "'"</span>

在這里,也可以將存儲過程,換成一般的文本類型查詢。因為是應用的參數賦值,使用字符拼接的方式,將組合查詢的三個情況看做是一種情況,也是可行的。

五、個人感想


學以致用,學了還要會用才行。剛開始學了設計模式的時候,真的感受不大。但用上了之后,真的覺得很方便。只是在用的過程中有點艱難,不過,把一個個的問題解決了,最后實現了,感覺真的很良好。


轉載于:https://www.cnblogs.com/hhx626/p/6010455.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259476.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

github常見操作和常見錯誤!錯誤提示:fatal: remote origin already exists.

原文鏈接&#xff1a;http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果輸入$ git remote add origin gitgithub.com:djqiang&#xff08;github帳號名&#xff09;/gitdemo&#xff08;項目名&#xff09;.git 提示出錯信息&#xff1a;fatal: remote or…

云計算的下半場

經常有人說互聯網上下半場的區別&#xff0c;大體上上半場燒錢&#xff0c;下半場分出勝負。自打美團王興拋出互聯網的下半場的說法&#xff0c;大家意識到這不僅僅是新美大的下半場&#xff0c;這更是整個互聯網行業的下半場。爆炸式的人口紅利帶來互聯網行業上半場的快速增長…

oracle中的l_satids,請問shared pool中的KQR L PO存放哪些數據

ROW CACHE 也叫做 dictionary cache &#xff0c;緩存數據字典基表如 OBJ$、COL$、IND$、SEQ$的信息以便解析SQL和library cache object。包括 KQR S PO &#xff0c; KQR M PO&#xff0c;KQR L PO &#xff0c; 等KQR > ROW CACHEkqr.h 1323 KSDTRADV("ROW_CACHE&quo…

This task is currently locked by a running workflow and cannot be edited

轉自&#xff1a;http://geek.hubkey.com/2007/09/locked-workflow.html 轉自&#xff1a;http://blogs.code-counsel.net/Wouter/Lists/Posts/Post.aspx?Listc04a88a9%2Dd138%2D4ac3%2Da2bb%2Db95c9fdd114e&ID118 SPWorkflow.AlertTask()的時候出現“This task is curren…

ETL模型設計

傳統的關系數據庫一般采用二維數表的形式來表示數據&#xff0c;一個維是行&#xff0c;另一個維是列&#xff0c;行和列的交叉處就是數據元素。關系數據的基礎是關系數據庫模型&#xff0c;通過標準的SQL語言來加以實現。 數據倉庫是多維數據庫&#xff0c;它擴展了關系數據庫…

《劍指offer》-整數中1出現的次數

題目描述 求出1~13的整數中1出現的次數,并算出100~1300的整數中1出現的次數&#xff1f;為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對于后面問題他就沒轍了。ACMer希望你們幫幫他,并把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的…

This is Me!——回顧第一個項目的前前后后

今天終于把論文敲完了&#xff0c;一路走來&#xff0c;頗多感想。遂寫下以下諸多文字&#xff0c;以饗讀者。 在說這個項目之前&#xff0c;先簡單介紹一下我的經歷。我叫王財勇&#xff0c;家是山西的&#xff0c;2009年至2013年在新疆大學就讀數學專業&#xff0c;也許有人…

從零開始學JavaScript三(變量)

一、變量 ECMAscript變量是松散型變量&#xff0c;所謂松散型變量&#xff0c;就是變量名稱可以保存任何類型的數據&#xff0c;每個變量僅僅是一個用于保存值的占位符。 定義變量時要使用var操作符 如&#xff1a; var message; /*定義一個名為message的變量&#xff0c;該變量…

DES加密過程例解

DES加密算法是最被廣泛使用的對稱加密算法&#xff0c;通過示例來演示DES、TribleDES&#xff08;3Key&#xff09; DES-ECB&#xff1a; 按8字節為單位進行加密&#xff0c;不足8字節補0key&#xff1a; 1111111111111111indata: 2222222222222222 OutData: 950973182317F8…

linux在雙系統中消失了,雙系統重新安裝windows后,ubuntu選項消失

1、首先用LiveCD進入ubuntu2、打開終端&#xff0c;&#xff0c;輸入&#xff1a;fdisk -l 查看自己linux的分區情況&#xff0c;我的分了4個區&#xff0c;swap&#xff0c;boot&#xff0c;/&#xff0c;home&#xff0c;對應的分別是&#xff1a;/dev/sda9 swap…

Cydia源局域網化

2019獨角獸企業重金招聘Python工程師標準>>> 步驟 在網址根目錄創建文件夾cydia&#xff0c;把你的deb文件放到 cydia/debs/ 文件夾下。在終端cd進入cydia文件夾輸入命令&#xff1a;dpkg-scanpackages debs /dev/null > Packages輸入命令&#xff1a;tar zcvf P…

前綴++ 后綴++ 運算符重載

下面例子程序中 const Fraction operator (int) 中 int不過是個啞元&#xff08;dummy&#xff09;,是永遠用不上的 它只是用來判斷&#xff0b;&#xff0b;是prefix 還是 postfix 記住&#xff0c;如果有啞元&#xff0c;則是postfix,否則&#xff0c…

固定資產調整對資產折舊的影響

固定資產折舊計提方法 一、原值增加&#xff1a; 1、已攤銷資產&#xff1a; 攤銷調整時間設在當期&#xff1a;(1078135) 在進行原值增加后&#xff0c;攤銷日期不變時&#xff0c;折舊在當月體現。 每月新增月折舊調增金額*(1-殘值率)/(折舊年限*12-已提折舊月份的個數) 例&a…

linux系統中 庫分為靜態庫和,Linux系統靜態庫與共享庫

8種機械鍵盤軸體對比本人程序員&#xff0c;要買一個寫代碼的鍵盤&#xff0c;請問紅軸和茶軸怎么選&#xff1f;This article mainly introduces the statics library and shared library on Linux and has done some experiments for better comprehension.Static library&am…

軟件工程概論作業01

軟件工程作業01 寫一個能自動生成三十道小學四則運算題目的 “軟件”&#xff0c;要求&#xff1a;除了整數以外&#xff0c;還要支持真分數的四則運算&#xff08;需要驗證結果的正確性&#xff09;、題目避免重復、可定制出題的數量。 思路&#xff1a;隨機生成兩個數進行計算…

成員指針運算符 .* 和 -*

轉載&#xff1a; http://www.groad.net/bbs/thread-5548-1-1.html 有一種特殊的指針叫做成員指針&#xff0c;它們通常指向一個類的成員&#xff0c;而不是對象中成員的特定實例。 成員指針并不是真正的指針&#xff0c;它只是成員在對象中的偏移量&#xff0c;它們分別是&am…

捕捉Entity framework 6的詳細異常提示

采用 try{}catch (Exception e){throw;}不能捕捉到詳細異常提示, e.message的內容為"Validation failed for one or more entities. See EntityValidationErrors property for more details." 如果需要獲取詳細的異常提示,采用 1 try2 {3 return…

8.16——熟悉安裝linux系統

一、linux的版本——CentOS CentOS&#xff08;Community ENTerprise Operating System&#xff09;是Linux發行版之一&#xff0c;它是來自于Red Hat Enterprise Linux依照開放源代碼規定釋出的源代碼所編譯而成。由于出自同樣的源代碼&#xff0c;因此有些要求高度穩定性的服…

linux中設置默認權限的命令,Linux默認權限掩碼

Linux教程Linux教程&#xff1a;http://www.fdlly.com/m/linux文章目錄默認權限掩碼設置權限掩碼以文字的方式設置權限掩碼查看系統當前的權限掩碼默認權限掩碼當我們創建文件或目錄時&#xff0c;系統會自動根據權限掩碼來生成預設權限&#xff1b;默認情況下的umask值是022(可…

percona-toolkit工具包安裝

percona-toolkit工具包同percona-xtrabackup一樣都是用Perl寫的工具包&#xff0c;percona-toolkit工具包是一組高級的管理mysql的工具包集&#xff0c;可以用來執行各種通過手工執行非常復雜和麻煩的mysql和系統任務&#xff0c;在生產環境中能極大的提高效率&#xff0c;安裝…