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
相关产品推荐
相关产品推荐

