Kein Millisekundenwert beim Lesen von DateTime-Werten aus einer SQL-Datenbank in C #

8

Ich habe Hochpräzisionsdaten in einem SQL-Server gespeichert, z. B.

%Vor%

Wenn ich diesen Wert jedoch in DateTime umwandle, ist der Wert für miliseconds des resultierenden DateTime-Werts 0:

%Vor%

Diese DateTime-Werte mit einer Genauigkeit von bis zu Millisekunden sind für mich sehr wichtig - was ist der beste Weg, dies zu tun?

UPDATE: Dies ist der Code, der die Konvertierung durchführt:

%Vor%

Es gibt nichts Besonderes an der SELECT -Anweisung, in der Tat ist es eine SELECT * - keine Phantasie-Güsse oder irgendetwas

Es scheint, dass das DateTime-Objekt, das von SqlDataReader zurückgegeben wird, einfach nicht mit dem Millisekunden-Wert

aufgefüllt ist     
Justin 22.09.2009, 16:02
quelle

5 Antworten

-2

So würde ich versuchen, das Problem zu beheben:

  1. gehen Sie im Debugger durch und schauen Sie sich den Typ und den Wert des Lesers [Timestamp] an. Wenn der Typ nicht SqlDateTime ist, würde mich das verdächtig machen - dann würde ich mir die Abfrage ansehen warum diese Spalte einen anderen Typ anstelle von DATETIME (oder DATETIME2 usw.) zurückgegeben hat

  2. Wenn dieser Wert SqlDateTime ist und Millisekunden enthält, dann betrachte ich den Cast als Quelle des Problems. Um dies zu überprüfen, würde ich versuchen (in Debugger oder Code) SqlDataReader.GetDateTime () und SqlDataReader.GetSqlDateTime () zu sehen, ob entweder das korrekte Ergebnis zurückgibt. Dies scheint zugegebenermaßen als Quelle des Problems wirklich unwahrscheinlich - Casting sollte gut funktionieren.

  3. Wenn dieser Wert von # 1 SqlDateTime ist, aber keine Millisekunden enthält, dann würde ich nach einem Problem in der Datenbank suchen, das vorgelagert ist. Mit anderen Worten: Ihre Abfrage gibt etwas ohne Millisekunden zurück. Wenn Sie genau dieselbe Abfrage in Management Studio ausführen, sehen Sie Millisekunden?

Meine Vermutung ist, dass dies ein Frage-bezogenes Problem ist. Aber ich bin fasziniert, mehr zu finden.

    
Justin Grant 22.09.2009, 16:49
quelle
14

Ich hatte das gleiche Problem und nach einigem Lesen stellt sich heraus, dass wenn Sie das Datum abrufen, wie Sie es taten

%Vor%

Der SQLDataReader löscht die Millisekunden. Wenn Sie jedoch die GetDateTime-Methode des SQLDataReader verwenden, wird ein DateTime-Objekt zurückgegeben, das die Millisekunden beibehält:

%Vor%     
CyberMacgyver 21.05.2012 05:37
quelle
6
5

Das liegt daran, dass die Standardformatzeichenfolge für DateTime keine Millisekunden enthält.

Wenn Sie ein benutzerdefiniertes Format verwenden, sehen Sie den Wert in Millisekunden.

Ein Beispiel:

%Vor%

Aus einer Datenbank mit diesen Werten:

%Vor%

Die resultierende Ausgabe aus dem obigen Code lautet:

%Vor%     
Magnus Johansson 22.09.2009 16:27
quelle
0

Ich hatte das gleiche Problem und löste es, indem ich die C # DateTime als SQL bigint mit DateTime.Ticks bearbeitete. Dadurch wird die vollständige DateTime-Genauigkeit beibehalten. Und natürlich kann mit dem DateTime (long ticks) -Konstruktor deserialisiert werden.

    
Gabriele Giuseppini 30.08.2012 14:10
quelle

Tags und Links