Domanda

Sto lavorando con un database Oracle più vecchio, e mi sento c'è probabilmente un modo migliore per andare circa unboxing i valori che ho recuperare dal database.

Al momento, ho una classe statica pieno di diversi metodi specifici del tipo:

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

.. e così via per diversi tipi, ma mi sento ci dovrebbe essere un modo migliore? Se voglio unboxing di un valore, faccio qualcosa lungo le linee di ...

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

Avevo pensato di usare una classe generica per gestire tutti i diversi tipi, ma non ho potuto capire il modo migliore per andare su questo.

Tutte le idee?

È stato utile?

Soluzione

Trovo metodi helper come i seguenti utile nello scenario - test per DBNull è più efficiente di cattura un'eccezione, come nel tuo esempio:

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;
    }
}

Questo funziona per la stringa ei soliti tipi di valore primitivo si incontrano (int, decimale, doppio, bool, DateTime).

E 'un po' diverso dal vostro esempio nel senso che getta piuttosto che convertiti - ma personalmente preferisco questo. Cioè se la colonna del database è numerico (decimale), preferirei essere esplicito se volevo convertire il valore in int, per esempio:.

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

Altri suggerimenti

Si potrebbe introdurre semplici classi del modello e della mappa tra di loro.

Ad esempio:

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

Naturalmente, per ridurre il codice duplicato, è possibile creare una classe di base per le classi di dati del modello.

A seconda di sforzo che si vuole spendere, si potrebbe andare e utilizzare un mapper ORM NHibernate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top