2017-05-19 4 views
0

Ich versuche Datensatz in Listarray zu holen wie folgt:Warum funktioniert der Nullkoaleszenzoperator in diesem Fall nicht?

List<Car> lst = new List<Car>(); 

string str = "select * from Inventory"; 

using(SqlCommand cmd = new SqlCommand(str,this.sqlcon)) 
{ 
    SqlDataReader rdr = cmd.ExecuteReader(); 

    while (rdr.Read()) 
    { 
     lst.Add(new Car 
        { 
         CarId = (int)rdr["CarId"], 
         Make = (string)(rdr["Make"] ?? ""), 
         Color= (string)(rdr["Color"] ?? ""), 
         PetName = (string)(rdr["PetName"] ?? "") 

        }); 
    } 

    rdr.Close(); 
} 

Fabrikat, Farbe und petname kann Nullwerte aufweisen und somit habe ich die ?? Operator. Ich erhalte den folgenden Fehler

Kann Objekt des Typs System.dbnull 'zu' system.string 'nicht umwandeln.

Was ist die korrekte Methode, in diesem Szenario auf Null zu prüfen?

+0

@Code eine gute Antwort bedeutet nicht, dass es nicht geschlossen werden kann. –

Antwort

8

DBNull ist nicht dasselbe wie null, daher können Sie den Operator ?? nicht verwenden. Sie müssen diesen Fall separat behandeln.

Replace:

Make = (string)(rdr["Make"] ?? ""), 

mit:

Make = (rdr["Make"] == System.DBNull.Value ? "" : (string)rdr["Make"]), 
+0

System.DBNull löst Kompilierungsfehler aus. Benutzte dbnull.value stattdessen und es hat gut funktioniert. TX! – Poongodi

+0

@Poongodi danke ich habe die Antwort aktualisiert – fubo

1

SqlDataReader gibt ein DBNull Objekt, das keine C# null ist, - es ist eine Aufgabe, einen NULL-Wert in der Datenbank darstellt.

Sie haben eine Reihe von Optionen, und ein Verfahren zu schaffen, das zu handhaben könnte sein, am besten lesen und Sie auf Wiederholung Code speichern:

private static string GetStringOrEmpty(object dbValue){ 
    return dbValue == System.DBNull.Value ? string.Empty : (string)dbValue; 
} 

und dann

Make = GetStringOrEmpty(rdr["Make"]), 

Alternativ schauen Sie in Dapper die ist ein sehr kleines, aber leistungsstarkes ORM, das viele dieser Dinge für Sie erledigen wird.

+0

System.DBNull wirft Kompilierungsfehler. Benutzte dbnull.value stattdessen und es hat gut funktioniert. TX! – Poongodi

Verwandte Themen