1. 程式人生 > >機房收費系統個人版——VB.NET組合查詢

機房收費系統個人版——VB.NET組合查詢

        在VB.NET機房收費系統個人版的過程中,又遇到了組合查詢了。機房收費系統的組合查詢是所有組合查詢型別中相對比較繁瑣和困難的。當然,在.NET的組合查詢中,我用的是拼接字串。

        下面以機房收費系統中“學生基本資訊維護”為例,講一下我是如何實現組合查詢的

         這是“學生基本資訊維護”的介面:

         

         我先說一下解決的思路:因為是用三層的思想,所以我們就需要考慮解決的方法和各個層應該放什麼內容。我 用的方法是拼接字串,所以首先U層:要在U層裡面定義一個函式,實現文字框裡面中英文的轉換;然後,定義一個字串,根據組合關係框的不同情況依次拼寫字串——


Public Class FormUI_ProtectStudentInfo
    '退出按鈕
    Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
        FormUI_Main.Show()
        Me.Hide()
    End Sub

    '查詢按鈕
    Private Sub btnQuery_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuery.Click
        '清空DataGridView控制元件的內容
        DataGridView1.DataSource = vbNull

        '欄位名不允許為空
        If cmbFieldBox1.Text.Trim() = "" Then
            MessageBox.Show("對不起,欄位名不允許為空,請您選擇欄位名", "資訊提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If

        '操作符不允許為空
        If cmbOperateBox1.Text.Trim() = "" Then
            MessageBox.Show("對不起,操作符不允許為空,請您選擇操作符", "資訊提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If

        '要查詢的內容不允許為空
        If txtQueryContent1.Text.Trim() = "" Then
            MessageBox.Show("對不起,請您輸入要查詢的內容,要查詢的內容不允許為空", "資訊提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If


        '拼接字串
        Dim sqlstring As String = Nothing

        '當組合關係框均為空時
        If cmbConbineBox1.Text = "" Then
            sqlstring = GetEnglish(cmbFieldBox1.Text) + cmbOperateBox1.Text + txtQueryContent1.Text

            '當第一個組合關係框為“或”第二個框為空時
        ElseIf cmbConbineBox1.Text = "或" And cmbCombineBox2.Text = "" Then
            sqlstring = GetEnglish(cmbFieldBox1.Text) + cmbOperateBox1.Text + txtQueryContent1.Text Or GetEnglish(cmbFieldBox1.Text) + cmbOperateBox2.Text + txtQueryContent2.Text

            '當第一個組合關係框為“與”第二個框為空時
        ElseIf cmbConbineBox1.Text = "與" And cmbCombineBox2.Text = "" Then
            sqlstring = GetEnglish(cmbFieldBox1.Text) + cmbOperateBox2.Text + txtQueryContent1.Text And GetEnglish(cmbFieldBox1.Text) + cmbOperateBox2.Text + txtQueryContent2.Text

            '當第一個框為“或”,第二個框為“或”時
        ElseIf cmbConbineBox1.Text = "或" And cmbCombineBox2.Text = "或" Then
            sqlstring = GetEnglish(cmbFieldBox1.Text) + cmbOperateBox1.Text + txtQueryContent1.Text Or GetEnglish(cmbFieldBox2.Text) + cmbOperateBox2.Text + txtQueryContent2.Text Or GetEnglish(cmbFieldBox3.Text) + cmdOperateBox3.Text + txtQueryContent3.Text

            '當第一個框為“與”第二個框為“與”時
        ElseIf cmbConbineBox1.Text = "與" And cmbCombineBox2.Text = "與" Then
            sqlstring = GetEnglish(cmbFieldBox1.Text) + cmbOperateBox1.Text + txtQueryContent1.Text And GetEnglish(cmbFieldBox2.Text) + cmbOperateBox2.Text + txtQueryContent2.Text And GetEnglish(cmbFieldBox3.Text) + cmdOperateBox3.Text + txtQueryContent3.Text

            '當第一個框為“或”第二個框為“與”
        ElseIf cmbConbineBox1.Text = "或" And cmbCombineBox2.Text = "與" Then
            sqlstring = GetEnglish(cmbFieldBox1.Text) + cmbOperateBox1.Text + txtQueryContent1.Text Or GetEnglish(cmbFieldBox2.Text) + cmbOperateBox2.Text + txtQueryContent2.Text And GetEnglish(cmbFieldBox3.Text) + cmdOperateBox3.Text + txtQueryContent3.Text

            '當第一個框為“與”第二個框為“或”
        ElseIf cmbConbineBox1.Text = "與" And cmbCombineBox2.Text = "或" Then
            sqlstring = GetEnglish(cmbFieldBox1.Text) + cmbOperateBox1.Text + txtQueryContent1.Text And GetEnglish(cmbFieldBox2.Text) + cmbOperateBox2.Text + txtQueryContent2.Text Or GetEnglish(cmbFieldBox3.Text) + cmdOperateBox3.Text + txtQueryContent3.Text

        End If


        '定義一個B層物件
        Dim uB As New BLL.BLL_ProtectStudentInfo
        Dim a As DataTable
        a = uB.query_st(sqlstring)
        If a.Rows.Count() > 0 Then
            DataGridView1.DataSource = a
        Else
            MessageBox.Show("沒有記錄", "資訊提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

    Public Function GetEnglish(ByVal strControl As String) As String
        Select Case (strControl)
            Case "卡號"
                Return "card_no"
            Case "學號"
                Return "student_id"
            Case "性別"
                Return "st_sex"
            Case "姓名"
                Return "st_name"
            Case "年級"
                Return "st_grade"
            Case "院系"
                Return "st_department"
            Case "班級"
                Return "st_class"
            Case Else
                Return ""
        End Select
    End Function
End Class

以上便是U層的情況,當然B層很簡單了,只要定義一個函式,返回D層的查詢結果就可以了,記住,在這個過程中,傳遞的是我們自己定義的拼接的字串哦
Public Class BLL_ProtectStudentInfo
    Public Function query_st(ByVal sqlstring As String) As DataTable
        '定義一個D層物件
        Dim bD As New DAL.DAL_ProtectStudentInfo
        Dim dt As New DataTable
        dt = bD.Query_ST(sqlstring)
        Return dt
    End Function
End Class

         D層就是根據所拼接的字串,一個SQL語句便搞定啦
Imports System.Data.SqlClient
Public Class DAL_ProtectStudentInfo
    '資料庫連線語句
    Dim str As String = "server=.;database=Computer room Charging System;integrated security=sspi"
    Dim conn As SqlClient.SqlConnection

    '建構函式,建立連線,開啟資料庫
    Public Sub New()
        conn = New SqlClient.SqlConnection
        conn.ConnectionString = str
        conn.Open()
    End Sub

    '定義一個函式
    Public Function Query_ST(ByVal sqlstring As String) As DataTable
        'SQL語句
        Dim sqlstr As String
        sqlstr = "select * from Student where " + sqlstring
        '執行
        Dim myAdapter As SqlDataAdapter = New SqlDataAdapter(sqlstr, conn)
        Dim myTable As New DataTable()
        myAdapter.Fill(myTable)
        Return myTable
    End Function

End Class