Modo corretto di unboxing valori di database
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?
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.