Frage

Wie kann ich prüfen, ob ein NULL Wert in einem offenen MySqlDataReader?

In der folgenden nicht funktioniert; Es ist immer das else schlagen:

if (rdr.GetString("timeOut") == null)
{
    queryResult.Egresstime = "Logged in";
}
else
{
    queryResult.Egresstime = rdr.GetString("timeOut");
}

rdr.IsDbNull(int i) akzeptiert nur eine Spaltennummer, nicht Namen.

War es hilfreich?

Lösung

var ordinal = rdr.GetOrdinal("timeOut");
if(rdr.IsDBNull(ordinal)) {
  queryResult.Egresstime = "Logged in";
} else {
  queryResult.Egresstime = rdr.GetString(ordinal);
}//if

oder

if(Convert.IsDBNull(rdr["timeOut"])) {
  queryResult.Egresstime = "Logged in";
} else {
  queryResult.Egresstime = rdr.GetString("timeOut");
}//if

Andere Tipps

if (rdr.GetString ( "timeout") == DBNull.Value)

null ist nicht die gleiche wie DBNull

Es tut mir leid, falsche Antwort, ist Sam B richtig. Ich verwechselte dies für DataRow Sachen.

SqlDataReader hat GetString() stark typisiert und bietet IsDBNull(int column) für diesen Fall.

Sie müssen rdr.IsDBNull(column) anrufen, um zu bestimmen, ob der Wert DbNull ist.

Sie können das Objekt vergleichen, die von NULL Feld abrufen mit DBNull .Wert .

Ändern null zu DBNull.Value.

Sie können auch tun:

If (string.IsNullOrEmpty(rdr.GetString("timeOut"))

Hier ist ein I wie:

var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");

Z. B (für die ursprüngliche Anforderung).

queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");

Hier ist eine Methode, die ich erstellt DBNull zu lesen und ein default(T) einhüllen zurück:

   private T GetNullable<T>(MySqlDataReader reader, int ordinal, Func<int, T> getValue)
        {
            if (reader.IsDBNull(ordinal))
            {
                return default(T);
            }
            return getValue(ordinal);
        }

Es kann wie folgt verwendet werden:

   if (reader.Read())
            {
                account = new Account();
                account.Id = reader.GetInt32(0);
                account.Name = reader.GetString(1);
                account.MailVerifiedAt = GetNullable(reader, 2, reader.GetDateTime);
                account.MailToken = GetNullable(reader, 3, reader.GetString);
            }

Der generische Typ T wird auf der Grundlage der Rückgabewert der reader.- Methode gelöst werden. Wenn es einen String zurückgibt werden Sie eine null Incase DBNull erhalten. Wenn es ein int ist, wird es 0 zurückkehren, etc.

. Hinweis: für ganzzahlige Werte kann es kein 0 zu bekommen, so vorsichtig sein, gewünscht wird

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top