76

我正在尝试执行一个存储过程,然后使用 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# 正确执行此操作

If Not IsDBNull(rsData("usr.ursrdaystime"))

任何帮助,将不胜感激!

4

11 回答 11

138

这应该有效。

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();
                 }
              }
           }
        }
     }

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

于 2012-05-03T12:57:48.680 回答
14

惯用的说法是:

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

这:

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

让它看起来就像你正在阅读一个值。改为使用IDbCommand.ExecuteScalar

于 2012-05-03T12:58:01.550 回答
7

与您的 VB 最接近的等价物是(请参阅此):

Convert.IsDBNull()

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

于 2012-05-03T13:03:17.023 回答
5

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

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

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

于 2012-05-03T12:58:41.847 回答
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

于 2012-05-03T12:58:48.900 回答
0
if(!rsData.IsDBNull(rsData.GetOrdinal("usr.ursrdaystime")))
{
  strLevel = rsData.GetString("usr.ursrdaystime"); 
}

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx

于 2012-05-03T13:01:30.303 回答
0

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

if(!(String.IsNullorEmpty(rsData["usr.ursrdaystime"].toString())){
        strLevel = rsData["usr.ursrdaystime"].toString();
    }
于 2017-11-08T18:22:57.213 回答
0

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

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

于 2018-10-24T12:48:42.170 回答
0

仍然有这样的替代选择:

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

您需要确切知道哪些列很重要。

于 2021-09-20T17:39:05.380 回答
0

只需检查

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

于 2022-03-01T09:44:38.777 回答
-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();
于 2012-05-03T13:01:15.227 回答