2009-12-17 15 views
3

Je travaille avec une ancienne base de données Oracle, et je pense qu'il y a probablement une meilleure façon de déballer les valeurs que je récupère de la base de données.Bonne façon de dégrouper les valeurs de la base de données

Actuellement, 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 La meilleure façon d'y arriver.

Des idées?

Répondre

6

je trouve des méthodes auxiliaires 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 de valeurs primitives habituelles vous rencontrerez (int, decimal, double, bool, DateTime).

Il est légèrement différent de votre exemple en ce sens qu'il ne produit pas mais convertit - 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 en int, .: par exemple

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

C'est génial, Joe, merci. Je suis désolé pour mon ignorance, mais je ne suis pas très clair sur la première ligne: Nullable public static ToNullable (valeur de l'objet) où T: struct En particulier, le « Nullable » suivi du " ToNullable "partie. Est-ce une méthode abrégée pour créer une classe/méthode? – KarlHungus

+0

C'est une déclaration de méthode: pour clarifier cela, j'ai ajouté une déclaration de classe (class MyHelper) à l'exemple. "Nullable " est le type de retour de la méthode et "ToNullable " est le nom de la méthode. Vous remplacez "T" par n'importe quel type, contraint par le fait qu'il doit être un type de valeur ou struct (où T: struct). Par conséquent, si vous appelez la méthode avec le type décimal (ToNullable ), le type de retour sera Nullable alias "decimal?". J'espère que c'est un peu plus clair. – Joe

+0

Ah, je ne connaissais pas la classe "Nullable" que vous aviez utilisée. Merci Joe. Je vous en suis reconnaissant. – KarlHungus

0

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 souhaitez dépenser, vous pouvez utiliser un mappeur ORM NHibernate.