2009-02-26 6 views
6

Je lis un résultat d'une base de données MS SQL 2008 avec un type de colonne dbtype.time d'un lecteur de données, en utilisant C# avec le framework DAAB 4.0. Mon problème est le MSDN docs dit que dbtype.time doit correspondre à une période de temps mais le seul constructeur proche pour le timespan je vois accepte un long, et le résultat retourné par le lecteur de données ne peut pas être converti en un long, ou directement à un timespanComment faire pour convertir le résultat Datareader de DbType.Time en objet Timespan?

J'ai trouvé ce Article qui montre la méthode datareader.getTimeSpan(), mais le lecteur de données dans daab 4.0 ne semble pas avoir cette méthode.

Comment puis-je convertir le résultat du lecteur de données en un objet de la plage de temps?

Répondre

6

GetTimeSpan est une méthode de OleDbDataReader et SqlDataReader (mais pas de l'interface IDataReader plus générique qui ExecuteReader rendements DAAB). Je suppose que l'instance IDataReader que DAAB vous a retournée est en fait une instance de SqlDataReader. Cela vous permet d'accéder à la méthode GetTimeSpan par coulée du IDataReader exemple appropiately:

using (IDataReader dr = db.ExecuteReader(command)) 
{ 
    /* ... your code ... */ 
    if (dr is SqlDataReader) 
    { 
     TimeSpan myTimeSpan = ((SqlDataReader)dr).GetTimeSpan(columnIndex) 
    } 
    else 
    { 
     throw new Exception("The DataReader is not a SqlDataReader") 
    } 
    /* ... your code ... */ 
} 

Edit: Si l'instance IDataReader n'est pas un SqlDataReader alors vous pourriez manquer l'attribut provider de votre chaîne de connexion définie dans votre app.config (ou web.config).

0

Quel est le type .NET de la valeur de la colonne? S'il s'agit d'un DateTime, vous pouvez transmettre la valeur de sa propriété Ticks (long) au constructeur TimeSpan. Par exemple.

var span = new TimeSpan(colValue.Ticks); 
9

Avez-vous essayé une distribution directe comme celle-ci?

TimeSpan span = (TimeSpan)reader["timeField"]; 

Je viens de tester ce rapidement sur ma machine et fonctionne très bien quand « timeField » est un type de temps dans la base de données (SQL).

+0

Les vôtres et les solutions de Ken sont bonnes. Cependant, si la valeur est null, le message d'exception de la solution de Ken est plus descriptif. 'SqlNullValueException - Les données sont nulles. Cette méthode ou propriété ne peut pas être appelée sur les valeurs Null' VS 'InvalidCastException - La distribution spécifiée n'est pas valide'. – TheWanderingMind

+1

Pour répondre à BishopBarber commentez si la colonne peut être nullable vous devriez le convertir en TimeSpan? type nullable et vérifiez null. 'TimeSpan? span = lecteur ["tsfield"] == DBNull.Value? (TimeSpan?) Null: (TimeSpan?) Reader ["tsfield"] ' –

+0

J'ai trouvé cette solution meilleure parce que je n'accède pas souvent à mon lecteur de données par index. J'ai cependant une méthode intermédiaire qui vérifie null. – MichaelChan

1

Voici mon:


using (IDataReader reader = db.ExecuteReader(command)) 
{ 
    var timeSpan = reader.GetDateTime(index).TimeOfDay; 
} 

Cleaner, peut-être!

+0

La couche de base de données lance un 'InvalidCastException' pour moi quand elle renvoie un type' TIME' mais j'essaye de lire avec 'GetDateTime()'. – binki

Questions connexes