在做機房收費系統過程中,遇到最有意思的一點就是處理組合查詢這一部分。
我們使用三層架構的目的是為瞭解耦,三層架構中分介面層、商務邏輯層、資料層和實體部分,他們各自有各自的職責,詳見我的部落格“如何學習和理解三層架構”。但是在處理組合查詢這一部分的時候,三層架構顯得如此不搭,那麼三層架構中如何處理組合查詢呢?
下面是我的處理方法:
首先,UI層(介面層):
代碼部分:
''' <summary>''' 查詢學生資訊''' </summary>''' <remarks></remarks>Public Class frmInquireStudentInfo Private Sub cmdInquire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdInquire.Click Dim selectstring As New Entity.SelectString Dim binquirestudentinfo As New BLL.InquireStudentInfo Dim dt As New DataTable Dim F1 As String '代替field1,欄位1 Dim F2 As String '代替field2,欄位2 Dim F3 As String '代替field3,欄位3 Select Case cmbField1.Text Case "學號" F1 = "ID" Case "卡號" F1 = "CardNo" Case "姓名" F1 = "Name" Case "性別" F1 = "Sex" Case "專業" F1 = "Department" Case "年級" F1 = "Grade" Case "班級" F1 = "ClassNo" Case Else F1 = "" End Select Select Case cmbField2.Text Case "學號" F2 = "ID" Case "卡號" F2 = "CardNo" Case "姓名" F2 = "Name" Case "性別" F2 = "Sex" Case "專業" F2 = "Department" Case "年級" F2 = "Grade" Case "班級" F2 = "ClassNo" Case Else F2 = "" End Select Select Case cmbField3.Text Case "學號" F3 = "ID" Case "卡號" F3 = "CardNo" Case "姓名" F3 = "Name" Case "性別" F3 = "Sex" Case "專業" F3 = "Department" Case "年級" F3 = "Grade" Case "班級" F3 = "ClassNo" Case Else F3 = "" End Select '將參數傳遞給實體selectstring selectstring.Field1 = F1 selectstring.Field2 = F2 selectstring.Field3 = F3 selectstring.Operator1 = cmbOperator1.Text selectstring.Operator2 = cmbOperator2.Text selectstring.Operator3 = cmbOperator3.Text selectstring.ResearchInfo1 = Trim(txtResearchInfo1.Text) selectstring.ResearchInfo2 = Trim(txtResearchInfo2.Text) selectstring.ResearchInfo3 = Trim(txtResearchInfo3.Text) selectstring.Combin1 = cmbCombin1.Text selectstring.Combin2 = cmbCombin2.Text '將查詢的結果給表並顯示 dt = binquirestudentinfo.InquireStudentInfo(selectstring) dgv.DataSource = dt dgv.AllowUserToAddRows = False End Sub
這裡UI層主要負責收集收據,並將資料傳遞給實體類。
BLL層,即業務處理層。主要負責商務邏輯的整合。
''' <summary>''' Module ID:B18 ''' Depiction:查詢學生基本資料類,用於完成查詢學生基本資料''' Author:李保強''' Create Dates:2012-05-06''' </summary>''' <remarks></remarks>Public Class InquireStudentInfo ''' <summary> ''' 查詢學生資訊 ''' </summary> ''' <param name="selectstring">實體選擇字串</param> ''' <returns>datatable表</returns> ''' <remarks></remarks> Public Function InquireStudentInfo(ByVal selectstring As Entity.SelectString) As DataTable Dim getinfobystring As New DAL.GetInfoByString Dim dt As New DataTable Try dt = getinfobystring.GetInfoByString("Student", selectstring) Return dt Catch ex As Exception Return dt End Try End FunctionEnd Class
BLL層調用DAL層的方法,因為BLL層對應於UI層,所以BLL層是知道該功能對應的資料表的名稱的,之所以在這裡設定表名稱,是為了用一個方法完成不同功能,當然方法不止一種,大家的方法我也看過幾種,大同小異吧。
DAL層,即資料層。
''' <summary>''' 通過字串獲得資訊。''' </summary>''' <remarks></remarks>Public Class GetInfoByString ''' <summary> ''' 通過字串獲得資訊。 ''' </summary> ''' <param name="table">資料庫表名稱</param> ''' <param name="selectstring">實體選擇字串</param> ''' <returns>datatable表</returns> ''' <remarks>author:李保強</remarks> Public Function GetInfoByString(ByVal table As String, ByVal selectstring As Entity.SelectString) As DataTable Dim helper As DBSQLHelper.SQLHelper helper = New DBSQLHelper.SQLHelper Dim dt As DataTable dt = New DataTable Dim selectstring1 As New Entity.SelectString Dim sql As String sql = selectstring.SelectString(table, selectstring) Try dt = helper.ExcuteReader(sql) Return dt Catch ex As Exception Return dt End Try End FunctionEnd Class
資料層主要和資料庫打交道。在這裡DAL層調用了實體的方法selectstring(table,selectstring),這裡實體中加入方法是我處理組合查詢的突破口,下面實體中大家可以看看這個方法的使用。
Entity層,即實體。(部分代碼)
''' <summary> ''' 產生選擇字串 ''' </summary> ''' <param name="table">資料庫表名稱</param> ''' <param name="ss">Selectstring ,實體選擇字串</param> ''' <returns>字串,sql語句</returns> ''' <remarks>author:李保強</remarks> Public Function SelectString(ByVal table As String, ByVal ss As SelectString) As String Dim sql As String Try sql = "select * from " & table & " where " & ss.Field1 & " " & ss.Operator1 & " '" & ss.ResearchInfo1 & "'" If ss.Combin1 = "" Then Return sql Else sql = sql & " " & ss.Combin1 & " " & ss.Field2 & " " & ss.Operator2 & " '" & ss.ResearchInfo2 & "'" If ss.Combin2 = "" Then Return sql Else sql = sql & " " & ss.Combin2 & " " & ss.Field3 & " " & ss.Operator3 & " '" & ss.ResearchInfo3 & "'" Return sql End If End If Catch ex As Exception '錯誤處理 sql = "" Return sql End Try End FunctionEnd Class
這裡實體只給處理selectstirng方法部分。
selectstring方法的功能是根據傳入的參數合成SQL語句,包括表的名稱,這樣做可以對不同功能進行組合查詢,但是只限於該功能所查詢的資料在一張表中或是在同一視圖中。
通過這樣處理的組合查詢,很好的遵守了三層架構的要求,實現瞭解耦的目的。