Подтвердить что ты не робот

Оператор DBNull if

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

Я привык к тому, чтобы просто проверить ниже, чтобы увидеть, возвращается ли значение и не уверен, что я делаю это правильно с помощью С#

Если Not IsDBNull (rsData ( "usr.ursrdaystime" ))

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Это:

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

Делает вид, будто вы читаете ровно одно значение. Вместо этого используйте IDbCommand.ExecuteScalar.

Ответ 4

Рассмотрим:

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

Ответ 5

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

Convert.IsDBNull()

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

Ответ 7

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

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

Ответ 8

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

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