一步一步挖出Compute

          

       前几天在做结账的时候,对数据表DataGridView控件的单列求和纠结了一番。
       如今差点儿养成了习惯,对于一些东西疏于開始的思考,不会先想到百度,这里我是先想到了第一版的机房收费那块的结账求和:
       截取了充值金额片段,代码例如以下:
      

'读取充值金额
    strSQL = "select sum(addmoney) as AddCash from Recharge_Info where UserID='" & Trim(comboOperatorUsername.Text) & "'And date= '" & Format(Date, "yyyy-mm-dd") & "' And status= '" & "未结账" & "'having sum(addmoney) is not null"
    Set mrcRecharge = ExecuteSQL(strSQL, MsgText)
    If mrcRecharge.EOF = True Then
        txtChargeCash.Text = 0
    Else
        txtChargeCash.Text = mrcRecharge("AddCash").Value  '退卡金额
    End If

       仿照这个,開始我仅仅是简单地像个小白一样像以下这样写:

    strSql = "Select sum(T_Charge.addMoney) From T_Charge Where UserID=@UserID and Date=@Date and status='False'"
    Dim parameters As SqlParameter() = {New SqlParameter("@UserID", chargeInfo.UserID),
                                        New SqlParameter("@Date", chargeInfo.ReturnCardDate)}    '给sql加入參数
    dt = help.ExecuteSelectstrSql,CommandType.Text, parameters)


 

        事实上開始自己也认为这样肯定是不行的,可是详细哪儿不正确?肯定是求和的sql语句!
        经过一番測试,果然不行,提示说“找不到addMoney列”
        于是自己開始茫然了,果断求度娘……
        因为不是亲生的,度娘没有给出想要的答案,差点儿都是和上边的一样。最后还得靠自己。
        经过断点调试,发现问题先从U层表现出来了。
        例如以下:txtChargeMoney.Text = dtAllChargeMoney.Rows(0)("addMoney").ToString()
        这里的txtChargeMoney.Text 收不到值。
        这次更加平静了些,理清思路,换了关键词,包括“VB.net、DatagridView、某列求和”,最终找出了Compute这个关键词!也是这个问题的关键点。

        DataTable.Compute方法:
        计算用来传递筛选条件的当前行上的给定表达式。
        语法:Public Function Compute ( expression As String, filter As String ) As Object
        參数:
        expression  类型:System.String,要计算的表达式,能够理解为 “參数须要的聚合函数”。
        filter  类型:System.String,要限制在表达式中进行计算的行的筛选器,可理解为:filter 确定在表达式中使用哪些行。
        返回值  类型:System.Object
        Object ,设置为计算结果。 假设该表达式计算得出 Null,则返回值将为即为 DBNull.Value。

        好了,依据以上信息,得出该sql语句应写成:

(D层)strSql = "Select T_Charge.addMoney From T_Charge Where UserID=@UserID and Date=@Date and status='False'"
(U层)txtChargeMoney.Text = dtAllChargeMoney.Compute("sum(addMoney)", "true").ToString()

        那么,攻克了单列的求和问题,假设是两列运算之后再求和,该怎么办?如:列a项和列b项之和。
        我们想当然的会觉得:Compute("sum(a * b),但事实上这样是错的!
        正解:在这样的情况下,假定有一个名为“c”的 DataColumn,而且 Expression 属性设置为:"a * b"
        Compute 方法的表达式參数将为:Sum(c)。

        小结:遇到问题还是要耐心找出关键点,编程不是一个“着急的活儿”。不断发现问题,解决这个问题,并扩展自己的知识,举一反三才是高速学习的有效途径之中的一个。

原文地址:https://www.cnblogs.com/blfshiye/p/4082027.html