帶有儲存過程的組合查詢

彎_彎發表於2013-02-21

組合查詢從它的表面的意思我們知道是通過一個條件或者多個條件進行查詢,我們先來看看組合查詢的介面:



程式碼:

U層:

Private Sub btnCheck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheck.Click
        Dim EntityWork As New CRCMEntity.CombinationqueryEntity
        Dim BllWork As New CRCMBLL.OperatorWorkRecordBLL
        '在只有一個條件的情況下.判斷條件是否輸入完整
        If cmbRelation1.Text = "" Then
            Dim arrayCtl() As Control
            ReDim Preserve arrayCtl(2)
            arrayCtl(0) = cmbFiles1
            arrayCtl(1) = cmbOperator1
            arrayCtl(2) = txtCondition1
            IsFrmControlEmpty.IsSomeEmpty(arrayCtl)
        End If

        '在有兩個條件進行組合查詢的時候判斷條件是否輸入完整
        If cmbRelation1.Text <> "" Then
            Dim arrayCtl() As Control
            ReDim Preserve arrayCtl(6)
            arrayCtl(0) = cmbFiles1
            arrayCtl(1) = cmbOperator1
            arrayCtl(2) = txtCondition1
            arrayCtl(3) = cmbRelation1
            arrayCtl(4) = cmbFiles2
            arrayCtl(5) = cmbOperator2
            arrayCtl(6) = txtCondition2
            IsFrmControlEmpty.IsSomeEmpty(arrayCtl)
        End If

        '在用三個條件進行組合查詢的時候判斷條件是否輸入完整
        If cmbRelation2.Text <> "" Then
            IsFrmControlEmpty.IsAllEmpty(Me)
        End If

        '第一行欄位名
        EntityWork.Filed1 = cmbFiles1.Text
        '第一行操作符
        EntityWork.Operater1 = cmbOperator1.Text
        '第一行條件
        EntityWork.Condition1 = txtCondition1.Text
        '第一行組合關係
        EntityWork.CombinationRelation1 = cmbRelation1.Text
        '第二行欄位名
        EntityWork.Filed2 = cmbFiles2.Text
        '第二行操作符
        EntityWork.Operater2 = cmbOperator2.Text
        '第二行條件
        EntityWork.Condition2 = txtCondition2.Text
        '第二行組合關係
        EntityWork.CombinationRelation2 = cmbRelation2.Text
        '第三行欄位名
        EntityWork.Filed3 = cmbFiles3.Text
        '第三行操作符
        EntityWork.Operater3 = cmbOperator3.Text
        '第三行條件
        EntityWork.Condition3 = txtCondition3.Text

        dgvWorkRecord.DataSource = BllWork.WorkRecord(EntityWork)
    End Sub

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Application.Exit()
    End Sub
End Class

在U層呼叫一個判斷控制元件是否為空的函式:

'************************************************* 
'作者:唐歡
'小組:  
'說明:判斷窗體介面的空間是否為空
'建立日期:2013/2/19
'版本號:V1.00
'**********************************************'
Public Class IsFrmControlEmpty
    ''' <summary>
    '''判斷窗體中所有的控制元件是否全部為空
    ''' </summary>
    Public Shared Function IsAllEmpty(ByVal Frm As Form) As Boolean
        Dim control As New Control
        For Each Ctl As Control In Frm.Controls '變數窗體中的所有控制元件
            If Ctl.GetType() Is GetType(TextBox) Then '判斷控制元件型別是否為TextBox
                If Ctl.Text.Length = 0 Then  '判斷TextBox是否為空,返回True,否則返回False
                    MessageBox.Show(String.Format("資訊為填寫完整,請把資訊填寫完整再儲存!"))
                    Ctl.Focus()
                    Return True
                    Exit Function
                End If
            ElseIf Ctl.GetType() Is GetType(ComboBox) Then '如果空間為Combobox,
                If Ctl.Text.Length = 0 Then  '如果Combobox為空,返回True,否則返回False
                    MsgBox(Ctl.Tag.ToString + "不能為空!", vbOK, "溫馨小提示")
                    Ctl.Focus()
                    Return True
                    Exit Function
                End If
            End If
        Next
        Return False
    End Function

    ''' <summary>
    '''判斷窗體中部分控制元件是否為空
    ''' </summary>
    Public Shared Function IsSomeEmpty(ByVal ArrayCtl() As Control) As Boolean
        Dim control As New Control
        For Each ctl As Control In ArrayCtl '遍歷陣列中所有元素
            If ctl.GetType() Is GetType(TextBox) Then '如果控制元件型別為TextBox
                If ctl.Text.Length = 0 Then '如果輸入框為空,返回True ,否則返回False
                    MsgBox(ctl.Tag.ToString + "不能為空!", vbOK, "溫馨小提示")
                    ctl.Focus() '輸入框獲得焦點
                    Return True
                    Exit Function

                End If
            ElseIf ctl.GetType() Is GetType(ComboBox) Then '判斷控制元件型別是否為Combobox
                If ctl.Text.Length = 0 Then '如果Combobox的為空,返回True,否則返回False
                    MsgBox(ctl.Tag.ToString + "不能為空!", vbOK, "溫馨小提示")
                    ctl.Focus()
                    Return True
                    Exit Function
                End If
            End If

        Next
        Return False
    End Function

B層:

 ''' <summary>
    ''' 查詢工作記錄
    ''' </summary>
    
    Public Function WorkRecord(ByVal WorkHistory As CombinationqueryEntity) As DataTable
        Dim EntityWork As New CRCMEntity.CombinationqueryEntity
        Dim DalWork As New CRCMDAL.OperatorWorkRecordDAL
        '第一行欄位名
        EntityWork.Filed1 = WorkHistory.Filed1
        '第一行操作符
        EntityWork.Operater1 = WorkHistory.Operater1
        '第一行條件
        EntityWork.Condition1 = WorkHistory.Condition1
        '第一行組合關係
        EntityWork.CombinationRelation1 = WorkHistory.CombinationRelation1
        '第二行欄位名
        EntityWork.Filed2 = WorkHistory.Filed2
        '第二行操作符
        EntityWork.Operater2 = WorkHistory.Operater2
        '第二行條件
        EntityWork.Condition2 = WorkHistory.Condition2
        '第二行組合關係
        EntityWork.CombinationRelation2 = WorkHistory.CombinationRelation2
        '第三行欄位名
        EntityWork.Filed3 = WorkHistory.Filed3
        '第三行操作符
        EntityWork.Operater3 = WorkHistory.Operater3
        '第三行條件
        EntityWork.Condition3 = WorkHistory.Condition3

        Dim table As DataTable  '定義一個資料集
        table = DalWork.SelectOperatorWorkRecord(EntityWork)
        Return table
    End Function

D層:

''' <summary>
    ''' 通過條件查詢查詢操作員工作記錄
    ''' </summary>
    Public Function SelectOperatorWorkRecord(ByVal WorkRecord As CombinationqueryEntity) As DataTable
        Dim sqlcmdstr As String = "PROC_CR_Select_OpertorWorkRecord"
        Dim paras As SqlParameter() = {New SqlParameter("@Field1", WorkRecord.Filed1),
                                    New SqlParameter("@Operation1", WorkRecord.Operater1),
                                    New SqlParameter("@Condition1", WorkRecord.Condition1),
                                    New SqlParameter("@Combinationrelations1", WorkRecord.CombinationRelation1),
                                    New SqlParameter("@Field2", WorkRecord.Filed2),
                                    New SqlParameter("@Operation2", WorkRecord.Operater2),
                                    New SqlParameter("@Condition2", WorkRecord.Condition2),
                                    New SqlParameter("@Combinationrelations2", WorkRecord.CombinationRelation2),
                                    New SqlParameter("@Field3", WorkRecord.Filed3),
                                    New SqlParameter("@Operation3", WorkRecord.Operater3),
                                    New SqlParameter("@Condition3", WorkRecord.Condition3)
                                   }
        Dim table As DataTable '定義一個資料集
        table = SqlHelp.Sqlhelper.SelectInfo(sqlcmdstr, CommandType.StoredProcedure, paras)
        Return table


    End Function


儲存過程:

-- =============================================
-- Author:		唐歡
-- Create date: 2013年2月15日
-- Description:	查詢操作員工作記錄
-- =============================================
ALTER PROCEDURE [dbo].[PROC_CR_Select_OpertorWorkRecord]
--第一行
@Field1 varchar(40), --欄位名
@Operation1 varchar(10),--操作符
@Condition1 char(50),--條件
@Combinationrelations1 char(10),  --組合關係

--第二行
@Field2 varchar(40), --欄位名
@Operation2 varchar(10),--操作符
@Condition2 char(50),--條件
@Combinationrelations2 char(10),  --組合關係

--第三行
@Field3 varchar(40), --欄位名
@Operation3 varchar(10),--操作符
@Condition3 char(50)--條件

AS
declare @Sql varchar(400)
declare @Sqlstr1 varchar(20)   --第一行中的欄位名對應表中欄位名
declare @Sqlstr2 varchar(20)   --第二行中的欄位名對應表中欄位名
declare @Sqlstr3 varchar(20)   --第三行中的欄位名對應表中欄位名
declare @SqlRelations1 varchar(20)  --表示第一行中的組合關係
declare @SqlRelations2 varchar(20)  --表示第二行中的組合關係

BEGIN
	--表示第一行中的欄位名用表中的欄位名錶示
IF (@Field1 ='教師')
set @Sqlstr1 ='UserName'
if (@Field1 ='登陸日期')
set @Sqlstr1 ='UseDate'
if (@Field1 ='登陸時間')
set @Sqlstr1 ='UseTime'
if (@Field1 ='登出日期')
set @Sqlstr1 ='NouseDate'
if (@Field1 ='登出時間')
set @Sqlstr1 ='NouseTime'
if (@Field1 ='機器名')
set @Sqlstr1 ='RoomNo'



--表示第二行中的欄位名用表中的欄位名錶示
IF (@Field2 ='教師')
set @Sqlstr2  ='UserName'
if (@Field2 ='登陸日期')
set @Sqlstr2 ='UseDate'
if (@Field2 ='登陸時間')
set @Sqlstr2 ='UseTime'
if (@Field2 ='登出日期')
set @Sqlstr2 ='NouseDate'
if (@Field2 ='登出時間')
set @Sqlstr2 ='NouseTime'
if (@Field2 ='機器名')
set @Sqlstr2 ='RoomNo'

--表示第三行中的欄位名用表中的欄位名錶示
IF (@Field3  ='教師')
set @Sqlstr3  ='UserName'
if (@Field3 ='登陸日期')
set @Sqlstr3 ='UseDate'
if (@Field3 ='登陸時間')
set @Sqlstr3 ='UseTime'
if (@Field3 ='登出日期')
set @Sqlstr3 ='NouseDate'
if (@Field3 ='登出時間')
set @Sqlstr3 ='NouseTime'
if (@Field3 ='機器名')
set @Sqlstr3 ='RoomNo'



--第一個組合關係
if (@Combinationrelations1='')
set @SqlRelations1=null
if (@Combinationrelations1='和')
set @SqlRelations1='AND'
if (@Combinationrelations1='或')
set @SqlRelations1='OR'

--第二個組合關係
if (@Combinationrelations2 ='')
set @SqlRelations2=null
if (@Combinationrelations2 ='和')
set @SqlRelations2 ='AND'
if (@Combinationrelations2 ='或')
set @SqlRelations2 ='OR'


set @Sql ='select UserName AS 使用者名稱,UseDate as 登陸日期,UseTime as 登陸時間,NouseDate as 退出日期,NouseTime  as  退出時間,RoomNo as 機器名 from WorkRecord  where '+@Sqlstr1 ++@Operation1+char(39)+@Condition1 +CHAR(39)
if (@SqlRelations1  is not null)
set @Sql =@Sql +@SqlRelations1 +CHAR(32)+@Sqlstr2 +@Operation2 +CHAR(39)+@Condition2 +CHAR(39)
if (@SqlRelations2 is not null)
set @Sql =@Sql +@SqlRelations2 +CHAR(32)+@Sqlstr3 +@Operation3 +CHAR(39)+@Condition3 +CHAR(39)
execute (@Sql)
END

Sqlhellp:

 ''' <summary>
    '''帶引數的查詢
    ''' </summary>
    Public Shared Function SelectInfo(ByVal CommandText As String, ByVal CommandType As CommandType, ByVal CommandParameters As SqlParameter()) As DataTable
        Dim sqlcn As New SqlConnection '定義資料庫連線物件
        sqlcn = GetConnect()
        sqlcn.Open() '開啟資料庫

        Dim sqlcmd As SqlCommand  '定義命令物件
        sqlcmd = New SqlCommand(CommandText, sqlcn)

        Dim InfoAdaptor As SqlDataAdapter '定義介面卡物件
        Dim InfoDataset As New DataSet  '定義一個資料集

        InfoAdaptor = New SqlDataAdapter(sqlcmd)
        sqlcmd.CommandType = CommandType

        sqlcmd.Parameters.AddRange(CommandParameters) '新增引數
        InfoAdaptor.Fill(InfoDataset) '填充介面卡
        Return InfoDataset.Tables(0)  '返回資料集的表,從第一個開始索引
        sqlcn.Close()
    End Function


總結:

1.儲存過程的編寫與使用,在剛開始學習資料的時候,只是知道有儲存過程和事務,但是從來沒有自己真正的動手去

寫,剛開始著手的時候,感覺挺難的,難主要是難在不知道從哪裡下手,剛開始寫簡單的儲存過程還可以,當寫組合

查詢這塊的儲存過程就是錯誤百出了,而且還不知道是在哪裡出現了錯誤,在網上查詢了很多關於儲存過程的內容,

搗鼓了幾天,終於做出來了,那一刻感覺真的是特別好。

2.Sqlhelp的編寫與使用,SQLHelp 知道它是在學習UML的時候,但是對它是挺好奇的,但是沒有怎麼去研究,這次

寫機房收費系統的程式碼,在D層用到資料連線,不斷的重複寫著同樣的語句,感覺特別的麻煩,就開始試著去寫

SQLHelp,在網上找了寫資料,我看著也都是迷迷糊糊的,看來看去,還不如我自己動手寫呢,寫完了,感覺不過就是

如此吧,SQLHelp 和VB版的模組差不多,對它我並不陌生。

3.對三層的應用,機房收費系統是用三層來做的,其實吧,用幾層來做並重要,重要的是理解分層的思想,就像有些

判斷不一定需要放在B層,也可以放在U層的。在做機房書費系統的時候,把三層運用得更加順手了。

4.有時候感覺很難很難,都是自己在嚇自己,遇到再難的問題,在我們面前還有一個巨人——百度,要相信自己。



相關文章