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)
Mar*_*ell 19
如果返回的第一个单元格是a null,则.NET中的结果为DBNull.Value
如果没有返回单元格,.NET中的结果将是null; 你不能打电话ToString()给null.您当然可以捕获ExecuteScalar返回的内容并单独处理null/ DBNull/其他情况.
由于您正在进行分组等,因此您可能拥有多个组.坦率地说,我不确定这ExecuteScalar是你最好的选择......
另外:问题中的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)
您可以使用如下所示
string result = null;
object value = cmd.ExecuteScalar();
if (value != null)
{
result = value.ToString();
}
conn.Close();
return result;
Run Code Online (Sandbox Code Playgroud)
值不为null,而是DBNull.Value。
object value = cmd.ExecuteScalar();
if(value == DBNull.Value)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
176847 次 |
| 最近记录: |