2009-02-13 12 views

Répondre

3

J'ai utilisé un emballage qui fait la même chose pendant un certain temps et qui fait bien l'affaire.

 

    RowHelper helper = new RowHelper(Dr); 
    MyValue = helper.IntColumn("ColumnName"); 
 

La chose à ce sujet est l'assistant retournera par défaut prédéfinies pour les colonnes NULL (ce qui est configurable). J'ai des méthodes pour tous les principaux types de données SQL.

Pour répondre à votre question, la deuxième méthode a un certain surcoût de boxing/unboxing mais ce serait sans doute une perte de temps que d'optimiser ceci pour une application commerciale typique.

+0

Cela ressemble à une aide agréable. Utilise-t-il en interne les méthodes Dr.Get (String/Int/etc.) Ou fait-il du casting? – cjk

+0

Initialement, j'ai utilisé des génériques et casté mais c'était trop désordonné, ne fonctionnait pas avec des choses comme les champs sql BIT trop bien. Alors maintenant, ça va le Get String, Int. Si vous souhaitez le code, je serais heureux de vous l'envoyer. –

1

DataReader renvoie l'objet type de sorte que vous devez convertir la valeur du DataReader en n'importe quel type MyValue est dans le cas de int

MyValue = (int)Dr("ColumnName"); 

ou

MyValue = Convert.ToInt(Dr("ColumnName")); 

ou

MyValue = Dr("ColumnName").ToInt(); 

Je ne suis pas sûr des différences de performance mais je pense que cela pourrait être interprété comme micro-optimisation, à moins de travailler sur des données très grands ensembles

4

La méthode DbDataReader.GetString (int) ne peut être utilisée que si vous connaissez l'index de la colonne. L'utilisation de DbDataReader.GetString ("ColumnName") n'est pas possible car il n'y a pas de surcharge. C'est à dire. vous avez les deux options suivantes:

string myValue1 = (string) Dr["ColumnName"]; 
string myValue2 = Dr.GetString(columIndex); 

La première ligne appelle en interne DbDataReader.GetOrdinal ("ColumnName").

3

J'ai fait deux ou trois méthodes d'extension génériques pour que:

public static class DataReaderExtensions 
{ 
    public static T GetValueOrNull<T>(this IDataRecord reader, string fieldName) 
     where T : class 
    { 
     int index = reader.GetOrdinal(fieldName); 
     return reader.IsDBNull(index) ? null : (T)reader.GetValue(index); 
    } 
} 

Vous obtenez l'image ... J'ai aussi un GetValueOrDefault pour les types de valeur.

0

En utilisant AutoMapper:

var dataReader = ... // Execute a data reader 
var views = Mapper.Map<IDataReader, IEnumerable<SomeView>>(_dataReader);