Pregunta

Estoy trabajando con una base de datos Oracle más viejo, y me siento es probable que haya una mejor manera de ir sobre unboxing los valores que recuperar de la base de datos.

Actualmente, tengo una clase estática completa de los diferentes métodos específicos del tipo:

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

.. y así sucesivamente para diferentes tipos, pero siento que debe haber una mejor manera? Si quiero desempacar un valor, hago algo en la línea de ...

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

Pensé en usar una clase genérica para manejar todos los tipos diferentes, pero realmente no pude averiguar la mejor manera de ir sobre eso.

¿Alguna idea?

¿Fue útil?

Solución

Encuentro métodos auxiliares como los siguientes útiles en el escenario - las pruebas de DBNull es más eficiente que la captura de una excepción, ya que en su ejemplo:

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

Esto funciona para la cadena de valor y los tipos primitivos habituales que se encontrará (int, decimal, doble, bool, DateTime).

Es un poco diferente de su ejemplo en el que se pone en lugar de conversos - pero personalmente prefiero esto. Es decir. Si la columna de la base de datos es numérico (decimal), prefiero ser explícita si quería convertir el valor a int, por ejemplo:.

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

Otros consejos

Se podría introducir clases de modelos simples y mapa entre ellos.

Por ejemplo:

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

Por supuesto, para reducir código duplicado, se puede crear una clase base para sus clases de datos modelo.

En función de los esfuerzos que desea invertir, usted podría ir y utilizar un asignador de ORM NHibernate.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top