Frage

Ich bin mit einer älteren Oracle-Datenbank zu arbeiten, und ich fühle mich gibt es wahrscheinlich einen besseren Weg über Unboxing die Werte gehe ich aus der Datenbank abgerufen werden.

Derzeit habe ich eine statische Klasse voll von verschiedenen typspezifischen Methoden:

public static int? Int(object o)
{
    try
    {
        return (int?)Convert.ToInt32(o);
    }
    catch (Exception)
    {
        return null;
    }
}

.. und so weiter für die verschiedenen Arten, aber ich fühle mich sollte es ein besserer Weg geben? Wenn ich einen Wert unbox will, das tue ich etwas entlang der Linien von ...

int i;
i = nvl.Int(dataRow["column"]); //In this instance, "column" is of a numeric database type

Ich dachte über eine generische Klasse mit all den verschiedenen Arten zu handhaben, aber ich kann nicht wirklich den besten Weg, darüber zu gehen, herauszufinden.

Irgendwelche Ideen?

War es hilfreich?

Lösung

I Hilfsmethoden wie die folgenden nützlich in Ihrem Szenario finden - für DBNull Prüfung ist effizienter als eine Ausnahme, wie in Ihrem Beispiel zu kontrollieren:

public static MyHelper
{
    public static Nullable<T> ToNullable<T>(object value) where T : struct
    {
        if (value == null) return null;
        if (Convert.IsDBNull(value)) return null;
        return (T) value;
    }

    public static string ToString(object value)
    {
        if (value == null) return null;
        if (Convert.IsDBNull(value)) return null;
        return (string)value;
    }
}

Dies funktioniert für die Zeichenfolge und den üblichen primitiven Werttypen auftreten wird (int, dezimal, Doppel-, Bool, Datetime).

Es ist etwas anders aus Ihrem Beispiel, dass es wirft eher als Konvertiten - aber persönlich ziehe ich dies. D. h wenn die Datenbankspalte NUMERIC (dezimal) ist, würde ich eher explizit sein, wenn ich den Wert int umwandeln will, z.

int? myIntValue = (int?) MyHelper.ToNullable<decimal>(reader["MyNumericColumn"]);

Andere Tipps

Sie können einfache Modellklassen einführen und Karte zwischen ihnen.

Zum Beispiel:

public class Customer
{
   public Customer(DataRow row) 
   {
      Name = row["Name"];
   }
   public Name { get; private set; }
}

Natürlich doppelten Code zu reduzieren, können Sie eine Basisklasse für Ihre Modelldaten-Klassen erstellen können.

auf Aufwand Je Sie ausgeben möchten, können Sie gehen und ein ORM-Mapper NHibernate verwenden.

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