我正在使用剃须刀在MS WebMatrix工作。
我遇到的问题是,如果我的一个查询解析为错误(例如除以0),则整个页面都会失败。我希望查询输出“0”。
代码:
var itot = db.QueryValue("SELECT SUM(SUBTOTAL) from dbo.DR_TRANS where TRANSDATE = 41195 and SUBTOTAL >0");
var ctot = db.QueryValue("SELECT SUM(SUBTOTAL) from dbo.DR_TRANS where TRANSDATE = 41195 and TRANSTYPE = 1 and SUBTOTAL <0");
var nett = itot + ctot;
因此,如果itot或ctot呈现Null或错误,因为所选日期没有条目,我如何让它将错误视为“0”,以便数学仍然有效?在这个例子中,itot是今天提出的总发票,ctot是今天筹集的总信用额。
如果还没有发票,或者还没有筹集任何信用,我的代码会抛出错误并关闭页面。我希望它显示0,如果没有任何一个,和itot的值如果没有ctot。
我做错了什么?它在每个都有的时候工作正常,但我希望它在此之前工作,因为页面上还有其他代码用于显示其他查询结果。
我对编码查询非常陌生,因此在线搜索时我会错过一个基本答案!
答案 0 :(得分:2)
使用COALESCE
包装聚合函数应该返回0
而不是NULL
:
SELECT COALESCE(SUM(SUBTOTAL), 0)
FROM dbo.DR_TRANS
WHERE TRANSDATE = 41195
AND SUBTOTAL >0
即如果第一个参数不为null则返回第一个参数的函数,如果第一个参数为NULL则返回第二个参数。我不知道webmatrix
使用什么功能,但COALESCE
非常标准。在Oracle中,您可以使用NVL
。 ISNULL
是另一个这样的功能。
答案 1 :(得分:1)
@Glenn使用SQL提供了一个非常好的解决方案。但是,您可能更愿意了解如何处理c#中的空值。 null-coalescing operator ??是满口的,如果某些东西不为空,则表示使用它,如果它为空,则使用后面的内容。一个例子比我刚才写的更容易理解。代码的最后一行如下所示:
var nett = itot ?? 0 + ctot ?? 0;
基本上?? ?? 0表示如果它为null,则将其视为零,否则使用该值本身。
我更喜欢在c#中尽可能多地做,并保持我的SQL尽可能简单。但我认识到这更多是个人偏好。
通常,在某些情况下,您必须处理SQL返回的空值,可能是null表示用户未输入任何内容的字段,零表示用户输入的值为零。在这种情况下,您可以在c#中测试null,例如
if ( itot == null )
{
// do appropriate null stuff
itot = 0;
}
else
{
// do non null stuff
// nothing needed in this case
}