2009-06-25 10 views
2

J'ai un objet de valeur simple que je remplis avec les données d'un IDataReader (peut être le résultat d'une requête sur une base de données Oracle ou MS SQL). La méthode de fabrication pour cet objet ressemble à quelque chose comme ce qui suit:Meilleures pratiques pour contourner les différences de base de données avec un IDataReader

internal static SomeClass CreateFromDataReader(IDataReader data) 
{ 
    string message = data.GetString(0); 
    short id = data.GetInt16(1); 
    DateTime dateStamp = data.GetDateTime(2); 
    return new SomeClass(message, id, dateStamp); 
} 

Je me suis alors tombé sur un problème qui est lié à la différence dans le type de données que les bases de données SQL Oracle et MS utiliser pour cette colonne particulière: dans Oracle ce type de données est un nombre tandis que pour MS SQL, le type de données utilisé est smallint.

Maintenant, alors que je pouvais « réparer » ce problème en faisant quelque chose comme ce qui suit:

short id = Convert.ToInt16(data.GetValue(1)); 

est-il un moyen meilleur ou plus élégante de le faire?

Répondre

1

Je ne sais pas comment les ORM prennent en charge un tel scénario. Cependant, vous devez utiliser un type qui peut prendre en charge les deux cas (tous) pour un tel champ.
J'ai regardé this table & il semble décimal est le type de données .net approprié que vous pourriez utiliser.

0

Votre idée est la bonne. Peut-être même plus court:

short id = Convert.ToInt16(data[1]); //8 characters less 

Ou faire une méthode d'extension.

public static short ToShort(this IDataReader r, int index) 
{ 
    return Convert.ToInt16(r[index]); 
} 

vous pouvez maintenant:

short id = data.ToShort(1); //18 characters less 

:)