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?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top