Инструкция DBNull if

Я пытаюсь выполнить хранимую процедуру, а затем использовать оператор if для проверки значений null, и я заканчиваю. Я парень 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"))

любая помощь будет оценили!

8 ответов


Это должно работать.

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

это автоматически утилизирует (закрывает) ресурсы за пределами блока { .. }.


идиоматический способ сказать:

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

Это:

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

делает вид, что Вы читаете ровно одно значение. Использовать IDbCommand.ExecuteScalar вместо.


да, просто проблема синтаксиса. Попробуйте вместо этого:

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

.Equals() проверяет, если два экземпляра Объекта того же.


ближайший эквивалент вашего VB будет (посмотреть этот):

Convert.IsDBNull()

но есть ряд способов сделать это, и большинство из них связаны отсюда


считаем:

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



Я использую строку.IsNullorEmpty часто. Это будет работать, потому что, когда DBNull установлен.ToString возвращает пустой.

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

сначала используйте ExecuteScalar

 objConn = new SqlConnection(strConnection);
 objConn.Open();
 objCmd = new SqlCommand(strSQL, objConn);
 object result = cmd.ExecuteScalar();
 if(result == null)
     strLevel = "";
 else 
     strLevel = result.ToString();