一步一步挖出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 [email protected] and [email protected] 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 [email protected] and [email protected] 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)。

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

一步一步挖出Compute

时间: 2024-07-29 20:09:28

一步一步挖出Compute的相关文章

一步一步学习Vue(十一)

本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var list = []; var Todo = (function () { var id = 1; return function (title, desc) { this.title = title; this.desc = desc; this.id = id++; } })(); /** *

loadrunner安装运行一步一步来(多图)

安装loadrunner 一路遇到很多坑,很多坑,坑,为什么呢? 因为这软件是收费的,他操作文档写的很详细,就是不写基础环境的配置,下面安装过程写详细一些,减少大家没必要时间上的浪费和对此的谩骂 现在loadrunner 12的版本已经出来了,不过还没有破解,所以先安装测试11的版本,不绕圈子,先下载, 链接: http://pan.baidu.com/s/1kT8CbVh 密码: v4br 加密码是怕被删 遇到的坑 下面是通用的安装说明: 1.下载loadrunner-11.zip文件,解压缩

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(二)

前言:上篇介绍了下封装BootstrapHelper的一些基础知识,这篇继续来完善下.参考HtmlHelper的方式,这篇博主先来封装下一些常用的表单组件.关于BootstrapHelper封装的意义何在,上篇评论里面已经讨论得太多,这里也不想过多纠结.总之一句话:凡事有得必有失,就看你怎么去取舍.有兴趣的可以看看,没兴趣的权当博主讲了个“笑话”吧. 本文原创地址:http://www.cnblogs.com/landeanfen/p/5746166.html BootstrapHelper系列

一步一步写jQuery插件

转载自:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jquery的插件机制,jquery有着成千上万的第三方插件,有时我们写好了一个独立的功能,也想将其与jquery结合起来,可以用jquery链式调用,这就要扩展jquery,写成插件形式了,如下

大流量网站性能优化:一步一步打造一个适合自己的BigRender插件(转)

BigRender 当一个网站越来越庞大,加载速度越来越慢的时候,开发者们不得不对其进行优化,谁愿意访问一个需要等待 10 秒,20 秒才能出现的网页呢? 常见的也是相对简单易行的一个优化方案是 图片的延迟加载.一个庞大的页面,有时我们并不会滚动去看下面的内容,这样就浪费了非首屏部分的渲染,而这些无用的渲染,不仅包括图片,还包括其他的 DOM 元素,甚至一些 js/css(某些js/css 是根据模块请求的,比如一些 ajax),理论上,每增加一个 DOM,都会增加渲染的时间.有没有办法能使得

一步一步学习SignalR进行实时通信_8_案例2

原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建立DrawingHub 页面 javascript 实现效果 结束语 参考文献 前言 这讲分析一个案例,在一个画板上画画实时在其他客户端上显示. 配置Hub 在Startup中进行配置: public void Configuration(IAppBuilder app) { app.MapSign

一步一步掌握线程机制(六)---Atomic变量和Thread局部变量

一步一步掌握线程机制(六)---Atomic变量和Thread局部变量 前面我们已经讲过如何让对象具有Thread安全性,让它们能够在同一时间在两个或以上的Thread中使用.Thread的安全性在多线程设计中非常重要,因为race condition是非常难以重现和修正的,我们很难发现,更加难以改正,除非将这个代码的设计推翻来过. 同步最大的问题不是我们在需要同步的地方没有使用同步,而是在不需要同步的地方使用了同步,导致效率极度低下.所以,我们要想办法限制同步,因为无谓的同步比起无谓的运算还更

【转】朱兆祺带你一步一步学习嵌入式(连载)

原文网址:http://bbs.elecfans.com/jishu_357014_2_1.html#comment_top  从最初涉及嵌入式Linux开始到现在,深深的知道嵌入式的每一步学习都是举步维艰.从去年11月份开始,我就着手整理各种学习资料,希望推动嵌入式学习的前进贡献自己微不足道的一份力量.从去年到现在,将C语言的学习经验整理成<攻破C语言笔试与机试陷阱及难点>(现在仍在更新),这份资料已经在电子发烧友论坛的单片机论坛连载(http://bbs.elecfans.com/jish