返回值使用String result = Command.ExecuteScalar()在结果返回null时发生错误

Sat*_*ngh 27 c# sql database asp.net sql-server-2008-r2

我想从数据库中获取第一行第一个单元格值,它可以很好地使用下面的代码.但是当没有找到结果时,它会抛出异常.

如何处理DBNull.
我应该更改我的查询吗?如果他们没有记录,哪些值会返回?

System.NullReferenceException:未将对象引用设置为对象的实例.

码:

    public string absentDayNo(DateTime sdate, DateTime edate, string idemp)
    { 
       string result="0";
       string myQuery="select COUNT(idemp_atd) absentDayNo from td_atd where ";
       myQuery +=" absentdate_atd between '"+sdate+"' and '"+edate+" ";
       myQuery +=" and idemp_atd='"+idemp+"' group by idemp_atd ";

       SqlCommand cmd = new SqlCommand(myQuery, conn);
       conn.Open();
//System.NullReferenceException occurs when their is no data/result
       string getValue = cmd.ExecuteScalar().ToString();
         if (getValue != null)
         {
            result = getValue.ToString();
         }
         conn.Close();
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

Dar*_*ren 58

没有必要继续调用,.ToString()因为getValue它已经是一个字符串.

除此之外,这条线可能是你的问题:

 string getValue = cmd.ExecuteScalar().ToString();  
Run Code Online (Sandbox Code Playgroud)

如果没有行将.ExecuteScalar返回,null所以你需要做一些检查.

例如:

var firstColumn = cmd.ExecuteScalar();

if (firstColumn != null) {
    result = firstColumn.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以使用`Convert.ToString(cmd.ExecuteScalar());`-如果值为null,则将为您提供String.Empty。 (2认同)

Mar*_*ell 19

如果返回的第一个单元格是a null,则.NET中的结果为DBNull.Value

如果没有返回单元格,.NET中的结果将是null; 你不能打电话ToString()null.您当然可以捕获ExecuteScalar返回的内容并单独处理null/ DBNull/其他情况.

由于您正在进行分组等,因此您可能拥有多个组.坦率地说,我不确定这ExecuteScalar是你最好的选择......


另外:问题中的sql在很多方面都很糟糕:

  • sql注入
  • 国际化(让我们希望客户和服务器就日期的样子达成一致)
  • 在单独的陈述中不必要的连接

我强烈建议你参数化; 也许用"dapper"之类的东西让它变得简单:

int count = conn.Query<int>(
  @"select COUNT(idemp_atd) absentDayNo from td_atd
    where absentdate_atd between @sdate and @edate
    and idemp_atd=@idemp group by idemp_atd",
    new {sdate, edate, idemp}).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

解决了所有问题,包括"无行"方案.日期作为日期(不是字符串)传递; 通过使用参数关闭注入孔.您也可以将查询计划重新使用作为额外的奖励.这group by是多余的,BTW - 如果只有一个组(通过相等条件),你也可以选择COUNT(1).


Raj*_*mar 10

试试这个吧

var getValue = cmd.ExecuteScalar();    
conn.Close();
return (getValue == null) ? string.Empty : getValue.ToString();
Run Code Online (Sandbox Code Playgroud)


Sar*_*nan 5

您可以使用如下所示

string result = null;
object value = cmd.ExecuteScalar();
 if (value != null)
 {
    result = value.ToString();
 }     
 conn.Close();
return result;
Run Code Online (Sandbox Code Playgroud)


Jān*_*nis 5

值不为null,而是DBNull.Value。

object value = cmd.ExecuteScalar();
if(value == DBNull.Value)
Run Code Online (Sandbox Code Playgroud)