组合查询(机房重构知识点总结)
歷經n多天。組合查詢模板最終做完了,總結一下這幾天的成果。和大家一起學習交流。
先看一下父窗口的關鍵代碼:
父窗口代碼:
Public Class frmComboQueryProtected Overridable Sub frmComboQuery_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim ComboxArray(4) As ComboBox '定義控件數組,獲取組合框ComboxArray(0) = cboOperator1ComboxArray(1) = cboOperator2ComboxArray(2) = cboOperator3ComboxArray(3) = cboRelation1ComboxArray(4) = cboRelation2CommonMethod.SelectIndex(ComboxArray) '設置combox默認顯示第一項Dim ControlArray(6) As Control '定義控件數組,獲取組合2和組合3的控件ControlArray(0) = cboField2ControlArray(1) = cboOperator2ControlArray(2) = txtContent2ControlArray(3) = cboRelation2ControlArray(4) = cboField3ControlArray(5) = cboOperator3ControlArray(6) = txtContent3CommonMethod.LockControlArray(ControlArray) '調用共同擁有方法,鎖定控件End SubPrivate Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.ClickTryDim ControlArray(2) As Control '定義控件數組,獲取組合1的控件ControlArray(0) = cboField1ControlArray(1) = cboOperator1ControlArray(2) = txtContent1If CommonMethod.IsEmptyControlArray(ControlArray) = False Then '推斷組合1的控件是否為空Exit SubEnd IfIf cboRelation1.Text.Trim <> "<請選擇>" Then '組合關系1不為空時ControlArray(0) = cboField2 '獲取組合2的控件ControlArray(1) = cboOperator2ControlArray(2) = txtContent2If CommonMethod.IsEmptyControlArray(ControlArray) = False Then '推斷組合2的條件是否為空Exit SubEnd IfIf cboRelation2.Text.Trim <> "<請選擇>" Then '組合關系2不為空時ControlArray(0) = cboField3 '獲取組合3的控件ControlArray(1) = cboOperator3ControlArray(2) = txtContent3If CommonMethod.IsEmptyControlArray(ControlArray) = False Then '推斷組合3的條件是否為空Exit SubEnd IfEnd IfEnd IfDim eComboQuery1 As New Entity.ComboQueryEntity '定義組合查詢實體,將條件傳入實體eComboQuery1.dbName = GetdbName()eComboQuery1.Field1 = cboField1.Text.TrimeComboQuery1.Field2 = cboField2.Text.TrimeComboQuery1.Field3 = cboField3.Text.TrimeComboQuery1.Operator1 = cboOperator1.Text.TrimeComboQuery1.Operator2 = cboOperator2.Text.TrimeComboQuery1.Operator3 = cboOperator3.Text.TrimeComboQuery1.Content1 = txtContent1.Text.TrimeComboQuery1.Content2 = txtContent2.Text.TrimeComboQuery1.Content3 = txtContent3.Text.TrimeComboQuery1.Relation1 = cboRelation1.Text.TrimeComboQuery1.Relation2 = cboRelation2.Text.TrimDim dtComboQuery As New DataTableDim mgr As New BLL.ComboQueryBLLdtComboQuery = mgr.ComboQuery(eComboQuery1)dgvRecord.DataSource = dtComboQueryCatch ex As ExceptionMessageBox.Show(ex.Message.ToString())dgvRecord.DataSource = NothingEnd TryEnd SubProtected Overridable Function GetdbName() As StringReturn ""End FunctionPrivate Sub cboRelation1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation1.SelectedIndexChangedDim ControlArray(3) As Control '定義控件數組。獲取組合2的控件和組合關系2的控件,ControlArray(0) = cboField2ControlArray(1) = cboOperator2ControlArray(2) = txtContent2ControlArray(3) = cboRelation2If cboRelation1.SelectedIndex = 0 Then '假設組合關系1為空,清空組合2和組合關系2CommonMethod.ClearControlArray(ControlArray)CommonMethod.LockControlArray(ControlArray)ElseCommonMethod.UnLockControlArray(ControlArray) '否則。解鎖組合2和組合關系2End IfEnd SubPrivate Sub cboRelation2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboRelation2.SelectedIndexChangedDim ControlArray(2) As Control '定義控件數組,獲取組合3的控件ControlArray(0) = cboField3ControlArray(1) = cboOperator3ControlArray(2) = txtContent3If cboRelation2.SelectedIndex = 0 Then '假設組合關系2為空。清空組合2。鎖定組合3CommonMethod.ClearControlArray(ControlArray)CommonMethod.LockControlArray(ControlArray)ElseCommonMethod.UnLockControlArray(ControlArray) '否則,解鎖組合3End IfEnd Sub End Class文中調用的公共方法上篇博客已寫,這里不再反復。
如今以查詢操作員工作記錄為例:
Public Class frmWorkLogProtected Overrides Sub frmComboQuery_Load(sender As Object, e As EventArgs)MyBase.frmComboQuery_Load(sender, e)Dim ComboxArray(2) As ComboBox '定義控件數組,獲取組合框ComboxArray(0) = cboField1ComboxArray(1) = cboField2ComboxArray(2) = cboField3CommonMethod.SelectIndex(ComboxArray) '設置combox默認顯示第一項End SubProtected Overrides Function GetdbName() As StringReturn "WorkLog"End Function End Class說明:1.設置默認第一項在父窗口加入了一部分,這里是字段的那部分,由于字段是在子窗口加入,所以假設這段代碼也放父窗口會報錯。
2.這里通過傳遞一個字符串來通知D層確定哪一個數據表,這里是我感覺不好的地方,可是臨時沒有想到其它方法。僅僅能先這么寫。
B層代碼:
D層代碼:
Imports System.Data.SqlClient Public Class SqlServerComboQueryDAL : Implements IDAL.IComboQueryDim sqlhelper As New SqlHelperPublic Function ComboQuery1(cboworklog As Entity.ComboQueryEntity) As DataTable Implements IDAL.IComboQuery.ComboQueryDim ecboworklog As New Entity.ComboQueryEntitySelect Case cboworklog.dbNameCase "WorkLog"ecboworklog = Method.SwitchWorklogField(cboworklog) '調用方法,轉換字段,以匹配數據庫Case "StudentAccount"ecboworklog = Method.SwitchStudentAccount(cboworklog)End SelectDim sqlParameter As SqlParameter()sqlParameter = New SqlParameter() {New SqlParameter("@dbName", ecboworklog.dbName),New SqlParameter("@Field1", ecboworklog.Field1),New SqlParameter("@Field2", ecboworklog.Field2),New SqlParameter("@Field3", ecboworklog.Field3),New SqlParameter("@Operator1", ecboworklog.Operator1),New SqlParameter("@Operator2", ecboworklog.Operator2),New SqlParameter("@Operator3", ecboworklog.Operator3),New SqlParameter("@Content1", ecboworklog.Content1),New SqlParameter("@Content2", ecboworklog.Content2),New SqlParameter("@Content3", ecboworklog.Content3),New SqlParameter("@Relation1", ecboworklog.Relation1),New SqlParameter("@Relation2", ecboworklog.Relation2)}Dim dtComboQuery As New DataTabledtComboQuery = sqlhelper.Query("sp_ComboQuery", CommandType.StoredProcedure, sqlParameter)Return dtComboQueryEnd Function End ClassD層轉換字段的方法:
Function SwitchWorklogField(ByVal eworklog As Entity.ComboQueryEntity)Dim strField(2) As String '字符串數組。暫時存放字段值Dim Field(2) As StringField(0) = eworklog.Field1Field(1) = eworklog.Field2Field(2) = eworklog.Field3For i = 0 To 2 '通過一個循環對字段進行匹配Select Case Field(i)Case "職工ID"strField(i) = "UserID"Case "登陸日期"strField(i) = "LoginDate"Case "登陸時間"strField(i) = "LoginTime"Case "注銷日期"strField(i) = "LogOffDate"Case "注銷時間"strField(i) = "LogOffTime"Case "電腦名"strField(i) = "ComputerName"Case ElsestrField(i) = ""End SelectField(i) = strField(i)Nexteworklog.Field1 = Field(0) '將字段值進行匹配。并賦值給組合查詢實體eworklog.Field2 = Field(1)eworklog.Field3 = Field(2)Dim strRelation(1) As String '定義字符串數組,暫時存在關系值Dim Relation(1) As StringRelation(0) = eworklog.Relation1Relation(1) = eworklog.Relation2For i = 0 To 1 '循環匹配字段Select Case Relation(i)Case "或"strRelation(i) = "OR"Case "且"strRelation(i) = "AND"Case ElsestrRelation(i) = ""End SelectRelation(i) = strRelation(i)Nexteworklog.Relation1 = Relation(0) '組合查詢實體賦值eworklog.Relation2 = Relation(1)eworklog.dbName = "T_WorkLog"Return eworklog '返回實體End Function
存儲過程代碼:
效果例如以下:
題外話:
??? 由于系統多次用到組合查詢,并且各個窗口很類似,所以最初僅僅是想到用窗口的繼承,免得做反復的窗口。后來父窗口做好之后,發現那些推斷是否為空、清空等代碼能夠寫到父窗口。然后子窗口寫關于查詢的代碼。
??? 緊接著就出現了一個問題,使用窗口繼承。對于同一個事件而言,程序會先運行父窗口中的代碼,后運行子窗口中的代碼。在我的程序里,當運行button的click事件時,父窗口會先推斷組合框是否為空。假設推斷出為空,給出了提示。當點完確定后,程序并沒有像想象中那樣停下來讓你選擇組合框,而是接著運行子窗口的查詢。
??? 后來僅僅好請教師父和師哥,得到一個解決的方法。就是聲明一個全局變量,由它通知子窗口是否運行,同一時候師哥指出,事實上子窗口的代碼也能夠放在父窗口中,我自己也認為聲明全局變量感覺不好。所以就演化到如今的樣子了。后來才知道,不知不覺還用了一個設計模式。模板方法模式。
??? 只是這個模式依舊須要子窗口去傳遞一個參數,讓D層去推斷是用的哪一個數據庫,感覺不好,可是也沒有想出好的辦法。假設大家有什么好的建議。望不吝奉獻。
?
轉載于:https://www.cnblogs.com/blfshiye/p/5379484.html
總結
以上是生活随笔為你收集整理的组合查询(机房重构知识点总结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第六章:继承和多态
- 下一篇: 怎样对ZBrush中的材料进行渲染和着色