C# 返回null值时数据库查询崩溃

C# 返回null值时数据库查询崩溃,c#,asp.net,sql,C#,Asp.net,Sql,我正试图消除我的web应用程序中的一个bug。基本上,我正在尝试实施一个餐厅预订系统。用户可以选择参加聚会的人数、坐席(午餐或晚餐)和日期。然后系统查询我的数据库,让用户知道是否有可用性。如果有一些人已经在餐厅预订了房间,但如果查询返回空值(即餐厅为空),系统将崩溃。我以前从未像这样处理过空值,我不知道如何处理代码中的这个错误,以便用户可以进行预订。我已经尽可能地对我的代码进行了注释。非常感谢您的帮助!:) protectedvoid availability按钮\u单击(对象发送方,事件参数e

我正试图消除我的web应用程序中的一个bug。基本上,我正在尝试实施一个餐厅预订系统。用户可以选择参加聚会的人数、坐席(午餐或晚餐)和日期。然后系统查询我的数据库,让用户知道是否有可用性。如果有一些人已经在餐厅预订了房间,但如果查询返回空值(即餐厅为空),系统将崩溃。我以前从未像这样处理过空值,我不知道如何处理代码中的这个错误,以便用户可以进行预订。我已经尽可能地对我的代码进行了注释。非常感谢您的帮助!:)

protectedvoid availability按钮\u单击(对象发送方,事件参数e)
{
//创建SQL数据库连接
//新的sql连接和命令
SqlConnection myconn=新的SqlConnection();
myconn.ConnectionString=“数据源=STUDENT2;初始目录=HarryBistro;集成安全性=True”;
SqlCommand cmd=新的SqlCommand();
cmd.Connection=myconn;
myconn.Open();
//检查所选日期是否为今天或更晚

如果(Calendar1.SelectedDate,您可以使用

isnull(your query,replacement_value)

您需要专门处理NULL值。NULL不是0,因此您无法使用它进行计算。有几种方法可以处理NULL,但如果您想处理数字,有一种方法很好,那就是将ISNULL()添加到sql查询中

SUM(ISNULL(NumberOfSeats,0))

但是,如前所述,SUM()永远不应该返回NULL,应该忽略NULL,因此我认为您的问题不在这一点上。

您应该在将值转换为int之前检查NULL

//Assign the value of the people in the restaurant to a variable
var obj = cmd.ExecuteScalar();

int peopleinrestaurant = obj != null ? (int)obj : 0;

在这种情况下,最简单的解决方案可能是不让查询返回NULL:

select COALESCE(SUM(Number_Of_Seats), 0) from RESERVATIONS where ...
改变


您的查询返回null,问题不在查询上,而是在c#的数据操作中。

您从哪里得到错误?乍一看,似乎您的PeopleInRestarant在没有预订的情况下应该有一个值0,而不是null。也就是说,您可以使用if(object==null)检查对象是否为null simple.ExecuteScalar
可能返回null,不能强制转换为
int
。在强制转换之前,您应该检查它的返回值。I stand corrected.SUM()如果找不到记录,则返回null。这样,您可以执行两次命令,最好将命令结果分配给一个对象一次,然后检查是否为null。我仍然不确定为什么SUM()会返回null,尽管使用COALESCE…+1。该关键字值得更多注意。经过简单的测试,我发现SUM()如果没有要求和的记录,则返回NULL,因此这确实是一个很好的答案(在我看来是最好的:)。COALESCE的优点是它可以(几乎?)在所有数据库上工作(例如Oracle有NVL而不是ISNULL),并且可以有多个参数(第一个非NULL值被返回)。假设MS Sql Server作为数据库,ISNULL也可以工作。如果没有选择任何记录进行求和,SUM()将返回NULL。我刚刚测试了它,并感到惊讶:)
select COALESCE(SUM(Number_Of_Seats), 0) from RESERVATIONS where ...
int peopleinrestaurant = (int)cmd.ExecuteScalar();
int peopleinrestaurant = cmd.ExecuteScalar() == null ? 0 : (int)cmd.ExecuteScalar();