DBNull if 语句

问题描述 投票:0回答:13

我正在尝试执行一个存储过程,然后使用 if 语句来检查空值,但我遇到了问题。我是一个 VB 人,所以如果我犯了一个小学生的语法错误,请容忍我。

objConn = new SqlConnection(strConnection);
objConn.Open();
objCmd = new SqlCommand(strSQL, objConn);
rsData = objCmd.ExecuteReader();
rsData.Read();

if (!(rsData["usr.ursrdaystime"].Equals(System.DBNull.Value)))
        {
            strLevel = rsData["usr.ursrdaystime"].ToString();

        }

这是否允许我检查 SQL 连接是否只返回一个值,如果是,则填充我的字符串?

我习惯于只检查下面的内容以查看是否返回了值,并且不确定我是否使用 C# 正确执行了该操作

如果不是 IsDBNull(rsData("usr.ursrdaystime"))

如有任何帮助,我们将不胜感激!

c# dbnull
13个回答
152
投票

这应该有效。

if (rsData["usr.ursrdaystime"] != System.DBNull.Value)
{
    strLevel = rsData["usr.ursrdaystime"].ToString();
}

还需要添加using语句,如下所示:

using (var objConn = new SqlConnection(strConnection))
     {
        objConn.Open();
        using (var objCmd = new SqlCommand(strSQL, objConn))
        {
           using (var rsData = objCmd.ExecuteReader())
           {
              while (rsData.Read())
              {
                 if (rsData["usr.ursrdaystime"] != System.DBNull.Value)
                 {
                    strLevel = rsData["usr.ursrdaystime"].ToString();
                 }
              }
           }
        }
     }

这将自动处置(关闭)块 { .. } 之外的资源。


14
投票

惯用的说法是:

if(rsData["usr.ursrdaystime"] != DBNull.Value) {
    strLevel = rsData["usr.ursrdaystime"].ToString();
}

这个:

rsData = objCmd.ExecuteReader();
rsData.Read();

使您看起来就像正在读取一个值。请使用

IDbCommand.ExecuteScalar
来代替。


8
投票

与 VB 最接近的等效项是(参见此):

Convert.IsDBNull()

但是有很多方法可以做到这一点,大多数都链接到从这里


5
投票

是的,只是一个语法问题。试试这个:

if (reader["usr.ursrdaystime"] != DBNull.Value)

.Equals()
正在检查两个对象实例是否相同


2
投票

考虑:

if(rsData.Read()) {
  int index = rsData.GetOrdinal("columnName"); // I expect, just "ursrdaystime"
  if(rsData.IsDBNull(index)) {
     // is a null
  } else {
     // access the value via any of the rsData.Get*(index) methods
  }
} else {
  // no row returned
}

另外:你需要更多

using
;p


1
投票

三元运算符在这里应该表现得很好: 条件?第一个表达式:第二个表达式;

strLevel = !Convert.IsDBNull(rsData["usr.ursrdaystime"]) ? Convert.ToString(rsData["usr.ursrdaystime"]) : null


1
投票

我知道这是一个 10 多年的老问题,但我遇到了这个问题,并且最近正在使用“Microsoft.Data.SqlClient”Version=“5.0.0-preview2.22096.2”在 .Net 6 应用程序中调试强制转换 SQL null 问题”,使用 DataTableReader

您需要在检索值之前使用阅读器的内置 IsDBNull 方法来测试值,因为使用任何 Get* 函数的隐式(或显式)转换可能会引发异常(因类型而异)

因此,对于 line-if 解决方案,以下内容是不好的: DateTime lastSentDate = DBNull.Value.Equals(reader.GetDateTime("LastSentDT")) ? reader.GetDateTime("LastSentDT") //Null无法转换为DateTime,抛出异常

这很好: DateTime lastSentDate = !reader.IsDBNull("LastSentDT") ? reader.GetDateTime("LastSentDT") : DateTime.Parse("1-1-2022");

希望这对 2022 年有帮助:)


0
投票

0
投票

我经常使用 String.IsNullorEmpty。这对她有用,因为当 DBNull 设置为 .ToString 时,它返回空。

if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){
        strLevel = rsData["usr.ursrdaystime"].toString();
    }

0
投票

还有这样一个替代选项:

strLevel = rsData.GetValue(0) is DBNull? "" : rsData.GetString(0);

您需要确切知道哪一列重要。


0
投票

只需检查一下即可

string val= string.IsNullOrEmpty(rsData["usr.ursrdaystime"]?"":rsData["usr.ursrdaystime"].ToString())


0
投票

不需要 System 前缀,因为几乎每个类都有该库。

if (reader["ColumnName"] != DBNull.Value)
{
    do someting;
}

-2
投票

首次使用 ExecuteScalar

 objConn = new SqlConnection(strConnection);
 objConn.Open();
 objCmd = new SqlCommand(strSQL, objConn);
 object result = cmd.ExecuteScalar();
 if(result == null)
     strLevel = "";
 else 
     strLevel = result.ToString();
© www.soinside.com 2019 - 2024. All rights reserved.