Question

Je travaille avec une base de données Oracle plus, et je pense qu'il ya probablement une meilleure façon d'aller sur unboxing les valeurs que je récupérer à partir de la base de données.

À l'heure actuelle, j'ai une classe statique complète des différentes méthodes spécifiques de type:

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

.. et ainsi de suite pour différents types, mais je me sens qu'il devrait y avoir une meilleure façon? Si je veux unbox une valeur, je fais quelque chose le long des lignes de ...

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

Je pensais à l'aide d'une classe générique pour gérer tous les différents types, mais je ne pouvais pas vraiment comprendre la meilleure façon d'aller à ce sujet.

Toutes les idées?

Était-ce utile?

La solution

Je trouve des méthodes d'assistance telles que les suivantes utiles dans votre scénario - test pour DBNull est plus efficace que d'attraper une exception comme dans votre exemple:

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

Cela fonctionne pour la chaîne et les types habituels de valeur primitive vous rencontrerez (int, décimal, double, bool, DateTime).

Il est légèrement différent de votre exemple en ce qu'il jette plutôt que des convertis - mais personnellement je préfère cela. C'est à dire. si la colonne de base de données est NUMERIC (décimal), je préfère être explicite si je voulais convertir la valeur int, par exemple:.

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

Autres conseils

Vous pouvez introduire des classes simples modèles et des cartes entre eux.

Par exemple:

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

Bien sûr, pour réduire la duplication de code, vous pouvez créer une classe de base pour vos classes de données du modèle.

En fonction de l'effort que vous voulez dépenser, vous pouvez aller et utiliser un ORM NHibernate mappeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top