利用SQL处理DataGrid表格问题

    在最初选定这个控件作为表格的显示容器来说,也曾经尝试使用mshflexgrid控件。毕竟第一次机房收费系统就使用的那个控件。控件的好坏咱不做评价。

    mshflexgrid这个控件,类似于excel,使用的时候需要循环赋值,然后再显示出来。期间运行多长时间,我不太清楚。总感觉很浪费吧。之后又接触了一个DataGridView控件,虽然表格的显示都差不多,用法也几乎类似。

在使用三层架构的机房收费系统里面,很多的数据传递的时实体或者是表格。对于传递表格情况来说,直接把表格通过一个控件来显示出来就行了呗。所以本次机房收费系统,就使用了DataGridView作为表格的容器。

 

DataGridView作为显示的方法:

既然要作为表格显示使用,就肯定要有表头,数据来源等问题吧。

如果为了图方便,在使用DataGridView的时候,可以设置数据源DataSource来替前设置要显示的数据信息,这样,在使用的时候,稍添加一些限制,即可做到查询。

 

   在知道以上那种方法之前,曾经考虑过一个问题,作为查询显示的表格,已经从D层,把表格处理好并且以此传回到U层了,在这种情况下,直接把返回来的dataTable作为数据源显示,同样可以达到目的。这样就省去设置数据源,测试链接等问题。

   在三层之间传递的是DataTable,dataTable作为一个虚拟表,把虚拟表优化之后,直接传递到DataGridView中显示。如果因为数据库里面的字段与要显示的字段不一致,那么通过SQL语句处理好之后在作为返回值传递。

在纠结dataGrid控件,列表头等问题的时候。直接使用sql语句来优化,之后直接使用DataGrid显示。

接下来看一个查询余额实例实现过程:

U层:

Private Sub btnQuery_Click(sender As Object, e As EventArgs) Handles btnQuery.Click

        '验证 两个文本框中是否为空
        Dim MyObject As New UIcommonFunction
        If MyObject.verifyNull(Controls) = False Then
            Exit Sub
        End If

        Dim queryBll As New BLL.SqlQueryRecordBLL

        Try
            Dim dtRechargeLog As New DataTable
            dtRechargeLog = queryBll.QueryRechargeLog(txtCardNo.Text)

            dataGrid.DataSource = dtRechargeLog
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try

    End Sub



U层中使用了一个公有的函数:

 ''' <summary>
    ''' 验证文本框是否为空
    ''' </summary>
    ''' <param name="log"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function verifyNull(log As Windows.Forms.Control.ControlCollection) As Boolean
        Dim objCon As New Control
        Dim flag As Boolean = True  '默认 所有文本框都不为空

        '开始检测每个控件 是否为空的判断
        For Each objCon In log
            If TypeOf (objCon) Is TextBox And objCon.Visible = True Then
                If objCon.Text = "" Then
                    MsgBox(objCon.Tag.ToString & " 不能为空,请输入完整", vbOKOnly, "提示")
                    objCon.Focus()
                    flag = False
                    Return flag
                End If
            ElseIf TypeOf (objCon) Is ComboBox And objCon.Visible = True Then
                If objCon.Text = "" Then
                    MsgBox(objCon.Tag.ToString & " 不能为空,请输入完整", vbOKOnly, "提示")
                    objCon.Focus()
                    flag = False
                    Return flag
                End If
            End If
        Next objCon

        Return True
    End Function


之后调用B层

''' <summary>
    ''' 获取充值记录
    ''' </summary>
    ''' <param name="cardNo"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function QueryRechargeLog(cardNo As String) As DataTable
        Dim iStudent As IDAL.IStudent
        iStudent = Factory.DBFactory.CreateStudent

        Dim iRechargeLog As IDAL.IRechargeLog
        iRechargeLog = Factory.DBFactory.CreateRechargeLog

        Dim dtStudent As New DataTable
        dtStudent = iStudent.QueryStudent(cardNo)

        '验证用户的卡号是否存在
        If dtStudent.Rows.Count = 0 Then
            Throw New Exception("卡号不存在")
        End If

        Dim dtRechargeLog As New DataTable
        dtRechargeLog = iRechargeLog.GetRechargeLog(cardNo)

        Return dtRechargeLog

    End Function


之后,表格的处理完全使用SQL语句来优化处理的:

''' <summary>
    ''' 查询指定时间段内的 收取金额
    ''' </summary>
    ''' <param name="stime">开始日期</param>
    ''' <param name="etime">终止日期</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetRechargeInDate(stime As String, etime As String) As DataTable Implements IDAL.IRechargeLog.GetRechargeInDate
        Dim strSQL As String = "select identity(int,1,1) as 序号,cardNo as 卡号,addCash as 充值金额,date as 日期,time as 时间,UserId as 操作人,status as 状态 into #1 from Recharge_Info where date between @sTime and @eTime  select * from #1 drop table #1"
        Dim sqlparams As SqlParameter() = {New SqlParameter("@sTime", stime),
                                           New SqlParameter("@eTime", etime)}

        Dim helper As New SqlHelper
        Dim dtRechargelog As New DataTable
        dtRechargelog = helper.Query(strSQL, CommandType.Text, sqlparams)
        Return dtRechargelog
    End Function


接口与工厂,与上个Demo类似,自行补充吧。

 

     DataGridView作为一个表格控件,可以事先设计好模版,之后显示,也可以仅仅作为一个容器来使用。sql语句可以处理的事情有很多,完全可以后台处理之后直接显示。

       有很多对表操作的地方,都可以用sql处理里面的知识解决。 视图 虚拟表就和很好的应用。

你可能感兴趣的:(性能优化,实战,VB.NET)