1. 程式人生 > >VB.NET+三層 機房收費系統之組合查詢

VB.NET+三層 機房收費系統之組合查詢

  關係組合查詢已經用去了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:建立一個檢視,直接調就行了。