You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Datatable.Compute仅返回正值问题:Sql Server Compact利润列求和异常

问题分析与解决方案

我来帮你拆解这个问题,你遇到的情况其实是DataTable.Compute方法的一个典型踩坑点~

为什么会出现这个现象?

当你调用Compute("Sum(Profit)", "Profit>=0")时,如果没有任何行满足Profit>=0的条件(比如你只插入了-5的那条数据),这个方法返回的不是null,而是DBNull.Value。你看到的类似{}的内容,其实是DBNull.ToString()的输出结果——这也就是为什么你检查sumProfit == null会失效,而且直接调用ToString()再转Decimal时,会抛出“输入字符串格式不正确”的异常:因为你试图把{}这个字符串转成数字,肯定失败呀。

怎么解决?

核心思路是先判断返回值是否为DBNull.Value,而不是null。如果是DBNull,就用0来替代,否则再正常转换。修改后的代码如下:

private DataTable dtbDailyOrders = MobileLine.getDailyOrdersByDate(from, to, out error);
if (dtbDailyOrders != null && dtbDailyOrders.Rows.Count > 0) {
    bindToGrid(dtbDailyOrders);
    
    // 处理盈利总和
    object sumProfitObj = dtbDailyOrders.Compute("Sum(Profit)", "Profit>=0");
    decimal sumProfit = sumProfitObj is DBNull ? 0 : Convert.ToDecimal(sumProfitObj);
    
    // 处理亏损总和
    object sumLossObj = dtbDailyOrders.Compute("Sum(Profit)", "Profit<0");
    decimal sumLoss = sumLossObj is DBNull ? 0 : Convert.ToDecimal(sumLossObj);
    
    txtProfit.Text = sumProfit.ToString("N2");
    txtLoss.Text = sumLoss.ToString("N2");
}

补充说明

这样修改后,不管有没有符合条件的行,都能安全处理:

  • 当没有盈利数据时,sumProfit会被设为0,最终显示为0.00
  • 当没有亏损数据时,sumLoss同理也会显示为0.00
  • 彻底避免了直接转换DBNull带来的异常问题

内容的提问来源于stack exchange,提问作者Plazza Sele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:37:30