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?

2voto

Panayot Minkov Punkte 21

Sie können den Bedingungsoperator verwenden:

employee.FirstName = sqlreader["indexFirstName"] != DBNull.Value ? sqlreader[indexFirstName].ToString() : "";

2voto

Sonny Boy Punkte 7462

Wir verwenden eine Reihe von statischen Methoden, um alle Werte aus unseren Datenlesern zu ziehen. In diesem Fall würden wir also Folgendes aufrufen DBUtils.GetString(sqlreader(indexFirstName)) Der Vorteil der Erstellung von statischen/gemeinsamen Methoden ist, dass Sie nicht immer wieder dieselben Prüfungen durchführen müssen...

Die statische(n) Methode(n) würde(n) Code zur Überprüfung auf Nullen enthalten (siehe andere Antworten auf dieser Seite).

1voto

Ahmed Kamal Punkte 2180

Alte Frage, aber vielleicht braucht noch jemand eine Antwort

In der Praxis habe ich dieses Problem folgendermaßen umgangen

Für int :

public static object GatDataInt(string Query, string Column)
    {
        SqlConnection DBConn = new SqlConnection(ConnectionString);
        if (DBConn.State == ConnectionState.Closed)
            DBConn.Open();
        SqlCommand CMD = new SqlCommand(Query, DBConn);
        SqlDataReader RDR = CMD.ExecuteReader();
        if (RDR.Read())
        {
            var Result = RDR[Column];
            RDR.Close();
            DBConn.Close();
            return Result;
        }
        return 0;
    }

dasselbe für String, nur dass "" anstelle von 0 zurückgegeben wird, da "" ein leerer String ist

Sie können es also verwenden wie

int TotalPoints = GatDataInt(QueryToGetTotalPoints, TotalPointColumn) as int?;

y

string Email = GatDatastring(QueryToGetEmail, EmailColumn) as string;

sehr flexibel, so dass Sie eine beliebige Abfrage einfügen können, um eine beliebige Spalte zu lesen, und sie wird nie mit einem Fehler zurückkehren

1voto

Ogglas Punkte 48648

Diese Methode ist abhängig von indexFirstName, der die auf Null basierende Ordnungszahl der Spalte sein sollte.

if(!sqlReader.IsDBNull(indexFirstName))
{
  employee.FirstName = sqlreader.GetString(indexFirstName);
}

Wenn Sie den Spaltenindex nicht kennen, aber einen Namen überprüfen wollen, können Sie stattdessen diese Erweiterungsmethode verwenden:

public static class DataRecordExtensions
{
    public static bool HasColumn(this IDataRecord dr, string columnName)
    {
        for (int i=0; i < dr.FieldCount; i++)
        {
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }
        return false;
    }
}

Wenden Sie die Methode wie folgt an:

if(sqlReader.HasColumn("FirstName"))
{
  employee.FirstName = sqlreader["FirstName"];
}

1voto

xux Punkte 11
private static void Render(IList<ListData> list, IDataReader reader)
        {
            while (reader.Read())
            {

                listData.DownUrl = (reader.GetSchemaTable().Columns["DownUrl"] != null) ? Convert.ToString(reader["DownUrl"]) : null;
                //null
                list.Add(listData);
            }
            reader.Close();
        }

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