web-dev-qa-db-fra.com

DBNull si déclaration

J'essaie d'exécuter une procédure stockée, puis d'utiliser une instruction if pour vérifier les valeurs nulles. Je suis un type VB, alors veuillez supporter si je commets une erreur de syntaxe d'écolier.

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

        }

Cela me permettrait-il de vérifier si la connexion SQL ne renvoie qu'une valeur et, le cas échéant, de renseigner ma chaîne?

Je suis habitué à pouvoir vérifier ci-dessous si une valeur est renvoyée et je ne suis pas sûr de le faire correctement avec C #

Si pas IsDBNull (rsData ("usr.ursrdaystime"))

Toute aide serait appréciée!

46
PipBoy

Cela devrait marcher. 

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

il faut aussi ajouter une déclaration using, comme ci-dessous:

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

cela va automatiquement disposer (fermer) les ressources en dehors du bloc {..}.

85
Kamil Lach

La manière idiomatique est de dire:

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

Ce:

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

Cela donne l'impression que vous lisez exactement une valeur. Utilisez IDbCommand.ExecuteScalar à la place.

9
jason

L'équivalent le plus proche de votre VB serait ( see this ):

Convert.IsDBNull()

Mais il y a plusieurs façons de le faire, et la plupart sont liées à partir d'ici

4
Cade Roux

Oui, juste un problème de syntaxe. Essayez ceci à la place:

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

.Equals() vérifie si deux instances d'objet sont identiques .

3
mgnoonan

Considérer:

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
}

Aussi: vous avez besoin de plus de using; p

2
Marc Gravell

J'utilise souvent String.IsNullorEmpty. Cela fonctionnera parce que lorsque DBNull est défini sur .ToString, il renvoie vide. 

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

L'opérateur ternaire devrait bien faire ici: condition? first_expression: second_expression;  

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

0
Goran Šutić