Comment convertir Datareader Résultat de DbType.Time à Timespan objet?
-
09-09-2019 - |
Question
Je suis en train de lire le résultat d'une MS SQL 2008 Base de données avec un type de colonne de dbtype.time d'un datareader, en utilisant c # avec le framework 4.0 DAAB.
Mon problème est la documentation MSDN disent dbtype.time devrait correspondre à un timespan mais le seul constructeur à proximité de timespan Je vois accepte un long, et le résultat renvoyé de la datareader ne peut pas être jeté à une longue, ou directement à un timespan .
J'ai trouvé cette Article whichs montre méthode datareader.getTimeSpan (), mais le datareader à daab 4.0 ne semble pas avoir cette méthode.
Alors, comment puis-je convertir le résultat de la datareader à un objet timespan?
La solution
GetTimeSpan
est une méthode de OleDbDataReader
et SqlDataReader
(mais pas de l'interface IDataReader plus générique qui renvoie des ExecuteReader
de DAAB). Je suppose que l'instance qui IDataReader
DAAB est revenu à vous est en fait une instance de SqlDataReader
. Cela vous permet d'accéder à la méthode GetTimeSpan
par coulée l'instance IDataReader
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)
Autres conseils
Avez-vous essayé un casting directe comme ça?
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).
Voici mon:
using (IDataReader reader = db.ExecuteReader(command))
{
var timeSpan = reader.GetDateTime(index).TimeOfDay;
}
Cleaner, peut-être!
Quel est le type de la valeur de la colonne .NET? Si c'est un DateTime alors vous pouvez passer la valeur de sa propriété Tiques (longue) au constructeur TimeSpan. Par exemple.
var span = new TimeSpan(colValue.Ticks);