关于C#ADO.NET:C#ADO.NET – 返回表中一列的总和

C# ADO.NET - return sum of one columns in table

在数据库的表中,有一个名为"cena"的列,其类型为整数。我需要对这些列进行合计,以计算整个表的"cena"。

为此,我使用了sqlcommand和executescalar()方法。

1
2
3
4
5
6
7
8
string sqlString = string.Format("Select Sum(Cena) From Ksiazki");
int returnValue ;

SqlCommand sqlComm = new SqlCommand();
sqlComm.CommandText = sqlString;
sqlComm.Connection = sqlConn;

returnValue = (int)sqlComm.ExecuteScalar();

只要表中有任何记录,它就可以正常工作,但是当数据库中的表为空时,它就会崩溃。

老实说,我不知道为什么会发生这种情况,所以如果有人能告诉我桌子空着的时候出了什么问题,为什么不返回0,我会非常感激。


当表为空时,SQL查询将返回空值。您不能将这个返回值强制转换为int,这就是为什么c抛出了一个错误。

如果您使用的是SQL Server,则可以检查是否为空并在数据库中替换为0。

1
Select Isnull(Sum(Cena), 0) From Ksiazki

您还可以使用coalesce,这是Isnull的更通用的形式(实际上是SQL标准的一部分)。


1
Select Coalesce(Sum(Cena), 0) From Ksiazki

因为空结果集上的sum将返回null

int不能是null(并且您将结果强制转换为int)

如果从sum得到null的话,coalesce操作符将返回0。


在代码的最后一行

1
returnValue = (int)sqlComm.ExecuteScalar();

是罪魁祸首,您试图将空值解析为int。这就是您的代码引发异常的原因。在分析到is之前,您应该检查is object是否为空。您可以使用"尝试并捕获"来防止不必要的错误。