VB.NET+三層 機房收費系統之組合查詢
阿新 • • 發佈:2018-12-31
關係組合查詢已經用去了4天的時間,每天都在痛苦中煎熬,絞盡腦汁,一句程式碼都要瞪大眼睛看好長時間,有時候,因為兩句話顛倒了,就nothing了;有時候,因為table怎樣能夠轉換成實體型別,將自己困住了,一想就是半天。狀況不斷呀,看了很多師哥師姐們的程式碼,他們分享著自己的程式碼,為了給大家一點東西,給拿出自己給大家分享,期望大家能給點意見。
步驟:
(1)、首先建立實體,實體是用來儲存變數的。
(2)、建立B層,B層除了有呼叫D層的函式,同時,它也有將漢字轉換為sql中的欄位的功能。
(3)、建立D層,D層中我呼叫的是檢視,應為我把學生表和卡表分開了(這個不打緊),如果你可以只查詢一張表,直接用查詢表就行了;如果用的資料不單單在一張表上的時候,可以試試用檢視,很簡單的。
(4)、建立U層,U層中主要是檢查格式是否正確(主要是有沒有空的,在程式碼中有詳細說明,看程式碼中的註釋就明白了)。
三層設計:
U層設計:
這裡我為什麼先寫U層呢?不應該先寫實體(E)層嗎?其實我就是先寫的U層,因為我也不知道,我用到了那些實體,它不光光包含了資料庫中的表的欄位,還有一些其他的引數。
U層的介面設計:
U層的程式碼:
Imports System.Data.SqlClient Imports System.Windows.Forms Public Class FrmOperStuInfo Private Sub btnQurry_Click(sender As Object, e As EventArgs) Handles btnQurry.Click '---------------------------------------------------------------- '第一行查詢不能為空,黨第一行為空的話,後面的條件都不能有內容, '當第一個組合框不為空是,第二行不能為空。同時,如果第一個組合框為空時,第二個組合框不能有內容 '當第二個組合框不為空時,第三行不能為空。 '----------------------------------------------------------------- Dim QueryStudent As New Entity.QueryStudentEntity '這個實體是用來傳實體的 Dim QueryStudentBLL As New BLL.QurryStudentBLL Dim controlArray(2) As Control Dim table As System.Data.DataTable '接收實體的,但用的不是entity型別的,傳回的是datatable,因為dataGirdView用的會比較舒服 Dim sqlstring As String 'sql的查詢語句 Dim relation1 As String Dim relation2 As String Try controlArray(0) = combofield1 '第一行 controlArray(1) = Combochar1 controlArray(2) = TextBox1 QueryStudent.Field1 = QueryStudentBLL.ChangeField(combofield1.Text) sqlstring = "SELECT * FROM V_QueryStudent WHERE " & QueryStudent.Field1 & Combochar1.Text & "'" & TextBox1.Text & "'" '當只有第一行有東西的時候 If CommonFunction.IsSomeEmptyText(controlArray) Then '輸入為空 Exit Sub End If If Comborela1.Text.Trim <> "" Then '第一個組合框不為空的時候 controlArray(0) = Combofield2 '第二行 controlArray(1) = Combochar2 controlArray(2) = TextBox2 QueryStudent.Field2 = QueryStudentBLL.ChangeField(Combofield2.Text) relation1 = QueryStudentBLL.ChangeRelation(Comborela1.Text) sqlstring = sqlstring & " " & relation1 & " " & QueryStudent.Field2 & Combochar2.Text & TextBox2.Text '當只有第一行有東西的時候 If CommonFunction.IsSomeEmptyText(controlArray) Then Exit Sub End If If Comborela2.Text.Trim <> "" Then '第二個組合框不為空的時候,第三行也一定不能為空 controlArray(0) = Combofield3 '第二行 controlArray(1) = Combochar3 controlArray(2) = TextBox3 QueryStudent.Field3 = QueryStudentBLL.ChangeField(Combofield3.Text) relation2 = QueryStudentBLL.ChangeRelation(Comborela2.Text) sqlstring = sqlstring & " " & relation2 & " " & QueryStudent.Field3 & Combochar3.Text & TextBox3.Text '當只有第一行有東西的時候 If CommonFunction.IsSomeEmptyText(controlArray) Then Exit Sub End If End If Else Comborela2.Text = "" '第一個組合框為空的時候,第二個組合框一定為空 End If QueryStudent.Field1 = combofield1.Text '往實體中傳參用的 QueryStudent.Field2 = Combofield2.Text QueryStudent.Field3 = Combofield3.Text QueryStudent.Char1 = Combochar1.Text QueryStudent.Char2 = Combochar2.Text QueryStudent.Char3 = Combochar3.Text QueryStudent.Relation1 = Comborela1.Text QueryStudent.Relation2 = Comborela2.Text QueryStudent.Content1 = TextBox1.Text QueryStudent.Content2 = TextBox2.Text QueryStudent.Content3 = TextBox3.Text QueryStudent.sqlstring = sqlstring '將字串也要傳給它 table = QueryStudentBLL.QueryStudent(QueryStudent) '接收返回值的table型別的 DataGridView1.DataSource = table '繫結 Catch ex As Exception MsgBox(ex.Message) End Try End Sub
公共函式:
Public Class CommonFunction Public Shared Function IsAllEmptyText(ByVal frm As Form) As Boolean Dim control As New Control For Each control In frm.Controls '遍歷窗體中所有的控制元件 'MsgBox(frm.Controls.Count) If TypeOf control Is TextBox Then '判斷控制元件是不是文字框 If control.Text.Trim = "" Then '判斷文字框內容是否為空 MsgBox(control.Tag.ToString + "不能為空!", vbOKOnly, "溫馨提示") control.Focus() Return True Exit Function End If ElseIf TypeOf control Is ComboBox Then '判斷控制元件是不是組合框 If control.Text.Trim = "" Then MsgBox(control.Tag.ToString + "不能為空!", vbOKOnly, "溫馨提示") Return True Exit Function End If End If Next Return False End Function ''' 判斷控制元件陣列中的控制元件的Text屬性是否為空,有空時返回true Public Shared Function IsSomeEmptyText(ByVal arrayControl() As Control) As Boolean Dim control As New Control For Each control In arrayControl '遍歷陣列中所有元素 If TypeOf control Is TextBox Then '判斷控制元件是不是文字框 If control.Text.Trim = "" Then '判斷文字框內容是否為空 'MsgBox(control.Tag.ToString + "不能為空!", vbOKOnly, "溫馨提示") MsgBox(control.Tag.ToString + "不能為空!", vbOKOnly, "溫馨提示") control.Focus() Return True Exit Function End If ElseIf TypeOf control Is ComboBox Then '判斷控制元件是不是組合框 If control.Text.Trim = "" Then 'MsgBox(control.Tag.ToString + "不能為空!", vbOKOnly, "溫馨提示") MsgBox("不能為空!", vbOKOnly, "溫馨提示") Return True Exit Function End If End If Next Return False End Function End Class
上面是一個窗體,是用來呼叫B層,下面是一個類,是用來判斷格式(是否有本不該為空的控制元件)通俗的講。
E層的程式碼:
Public Class QurryStudentBLL
Public Function ChangeObject(ByVal qurryStudent As Entity.QueryStudentEntity) As Entity.QueryStudentEntity
qurryStudent.Field1 = ChangeField(qurryStudent.Field1)
qurryStudent.Field2 = ChangeField(qurryStudent.Field2)
qurryStudent.Field3 = ChangeField(qurryStudent.Field3)
'這裡的char 是不需要轉換的
qurryStudent.Relation1 = ChangeRelation(qurryStudent.Relation1)
qurryStudent.Relation2 = ChangeRelation(qurryStudent.Relation2)
Return qurryStudent
End Function
Public Function ChangeField(ByVal strField As String) As String '轉換欄位
Dim strFields As String = ""
Select Case strField
Case "卡號"
strFields = "CardNo"
Case "學號"
strFields = "StudentNO"
Case "姓名"
strFields = "StudentName"
Case "性別"
strFields = "Sex"
Case "系別"
strFields = "Department"
Case "年級"
strFields = "Grade"
Case "班級"
strFields = "Class"
End Select
Return strFields
End Function
Public Function ChangeRelation(ByVal strRelation As String) As String '轉換組合符
Dim strRelations As String = ""
Select Case strRelation
Case "與"
strRelations = "AND"
Case "或"
strRelations = "OR"
Case ""
strRelations = "" '這裡也可以給它賦一個空值
End Select
Return strRelations
End Function
Public Function QueryStudent(ByVal QueryStudentBLL As Entity.QueryStudentEntity) As System.Data.DataTable
Dim queryStudentDAL As New DAL.StudentDAL
Dim queryStudents As New System.Data.DataTable
queryStudents = queryStudentDAL.QueryStudent(QueryStudentBLL)
Return queryStudents
End Function
End Class
通過U層,就可以知道,B層裡面需要轉換的字元,以及呼叫D層的函式。
Function QueryStudent(ByVal queryStudent1 As Entity.QueryStudentEntity) As System.Data.DataTable
Dim conn As SqlConnection = New SqlConnection(SqlUtil.connstring()) '定義連線開啟資料庫,這裡也有另一種方法寫
Dim sql As String
sql = queryStudent1.sqlstring
Dim cmd As SqlCommand = New SqlCommand(sql, conn) '定義資料庫命令
'cmd.CommandText = sql '儲存過程
'cmd.CommandType = CommandType.Text
Dim myAdapter As SqlDataAdapter = New SqlDataAdapter(cmd)
Dim table As DataTable = New DataTable() '要返回的是datatable型別的
Try
conn.Open()
myAdapter.Fill(table) 'fill是用來將Adapter查詢到的檢視,放到table裡面
Catch ex As Exception
MsgBox(ex.Message)
End Try
Return table
End Function
End Class
好的,到了這裡就整個都寫完了。
注意:
(1)、DataTable這樣轉換為實體型別?答:不需要一個一個賦值,真的很麻煩,直接這樣就可以了//table = QueryStudentBLL.QueryStudent(QueryStudent) '接收返回值的table型別的//.
(2)、如果我在SQL中用來了兩個表查詢,是不是建立兩個實體,兩個B層呀?答:不需要,方法1:建立一個實體,將兩個表所用到的欄位放到裡面,方法2:建立一個檢視,直接調就行了。