6 Stimmen

Wie konvertiert man das Datareader-Ergebnis von DbType.Time in das Timespan-Objekt?

Ich lese ein Ergebnis aus einer MS SQL 2008-Datenbank mit einem Spaltentyp dbtype.time aus einem Datareader, mit c# mit DAAB 4.0 Framework.

Mein Problem ist die MSDN-Docs sagen dbtype.time sollte eine Zeitspanne zuordnen, aber die nur schließen Konstruktor für Zeitspanne sehe ich akzeptiert eine lange, und das Ergebnis zurückgegeben von der Datareader kann nicht in eine lange oder direkt in eine Zeitspanne gegossen werden.

Ich fand dies Artikel die die Methode datareader.getTimeSpan() zeigt, aber der datareader in daab 4.0 scheint diese Methode nicht zu haben.

Wie konvertiere ich also das Ergebnis aus dem Datareader in ein Zeitspannenobjekt?

10voto

BFree Punkte 100035

Haben Sie schon einmal einen solchen Direktguss ausprobiert?

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

Ich habe dies gerade schnell auf meinem Rechner getestet und es funktioniert gut, wenn "timeField" ein Zeit-Datentyp in der Datenbank (SQL) ist.

7voto

Ken Browning Punkte 27913

GetTimeSpan ist eine Methode der OleDbDataReader y SqlDataReader (aber nicht von der allgemeineren IDataReader-Schnittstelle, die DAAB's ExecuteReader zurück). Ich gehe davon aus, dass die IDataReader Instanz, die DAAB an Sie zurückgegeben hat, ist eigentlich eine Instanz von SqlDataReader . Dies ermöglicht Ihnen den Zugriff auf die GetTimeSpan Methode durch Casting der IDataReader Instanz geeignet:

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 ... */
}

Bearbeiten: Wenn die IDataReader Instanz ist keine SqlDataReader dann fehlt Ihnen möglicherweise die provider Attribut Ihrer Verbindungszeichenfolge, die in Ihrer app.config (oder web.config) definiert ist.

1voto

Jason Steele Punkte 11

Hier ist meine Meinung dazu:

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

Sauberer, vielleicht!

0voto

Adam Ralph Punkte 28333

Was ist der .NET-Typ des Spaltenwerts? Wenn es sich um eine DateTime handelt, können Sie den Wert der Ticks-Eigenschaft (long) an den TimeSpan-Konstruktor übergeben. Z.B.

var span = new TimeSpan(colValue.Ticks);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X