375 Stimmen

SQL Data Reader - Behandlung von Null-Spaltenwerten

Ich verwende einen SQLdatareader, um POCOs aus einer Datenbank zu erstellen. Der Code funktioniert, außer wenn er auf einen Nullwert in der Datenbank trifft. Wenn zum Beispiel die Spalte Vorname in der Datenbank einen Nullwert enthält, wird eine Ausnahme ausgelöst.

employee.FirstName = sqlreader.GetString(indexFirstName);

Wie kann man in dieser Situation am besten mit Nullwerten umgehen?

16voto

Vijai Punkte 1999

Sie können eine generische Funktion schreiben, um Null zu prüfen und den Standardwert einzuschließen, wenn er NULL ist. Rufen Sie diese Funktion beim Lesen von Datareader auf

public T CheckNull<T>(object obj)
        {
            return (obj == DBNull.Value ? default(T) : (T)obj);
        }

Beim Lesen des Datareaders verwenden Sie

                        while (dr.Read())
                        {
                            tblBPN_InTrRecon Bpn = new tblBPN_InTrRecon();
                            Bpn.BPN_Date = CheckNull<DateTime?>(dr["BPN_Date"]);
                            Bpn.Cust_Backorder_Qty = CheckNull<int?>(dr["Cust_Backorder_Qty"]);
                            Bpn.Cust_Min = CheckNull<int?>(dr["Cust_Min"]);
                         }

16voto

el bayames Punkte 167

Ich glaube nicht, dass es eine NULL Spaltenwert, wenn Zeilen innerhalb eines Datareaders unter Verwendung des Spaltennamens zurückgegeben werden.

Wenn Sie das tun datareader["columnName"].ToString(); erhalten Sie immer einen Wert, der eine leere Zeichenkette sein kann ( String.Empty wenn Sie vergleichen wollen).

Ich würde Folgendes verwenden und mir keine allzu großen Sorgen machen:

employee.FirstName = sqlreader["columnNameForFirstName"].ToString();

13voto

Michael Todd Punkte 16235

Eine Möglichkeit, dies zu tun, besteht darin, nach Nullen in der Datenbank zu suchen:

employee.FirstName = (sqlreader.IsDBNull(indexFirstName) 
    ? ""
    : sqlreader.GetString(indexFirstName));

12voto

Summer-Time Punkte 1794

Diese Lösung ist weniger anbieterabhängig und arbeitet mit einem SQL-, OleDB- und MySQL-Reader:

public static string GetStringSafe(this IDataReader reader, int colIndex)
{
    return GetStringSafe(reader, colIndex, string.Empty);
}

public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue)
{
    if (!reader.IsDBNull(colIndex))
        return reader.GetString(colIndex);
    else
        return defaultValue;
}

public static string GetStringSafe(this IDataReader reader, string indexName)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName));
}

public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue);
}

11voto

Project Mayhem Punkte 403

Durch die Beeinflussung von getpsyched's Antwort Ich habe eine generische Methode erstellt, die den Spaltenwert anhand seines Namens überprüft

public static T SafeGet<T>(this System.Data.SqlClient.SqlDataReader reader, string nameOfColumn)
{
  var indexOfColumn = reader.GetOrdinal(nameOfColumn);
  return reader.IsDBNull(indexOfColumn) ? default(T) : reader.GetFieldValue<T>(indexOfColumn);
}

Verwendung:

var myVariable = SafeGet<string>(reader, "NameOfColumn")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X