2012-04-23 15 views
15

Ich habe versucht, eine Beispiel Northwind SQLite-Datenbank zu lesen, aber einen Fehler auf einigen Tabellen mit einer Datetime. Ist das ein Problem der Datenbank oder meiner System.Data.SQLite? Die Ausnahme ist somethin wie: „die Zeichenfolge ist keine gültige Datetime“SQLite ExecuteReader -> DataTable.Load -> FormatException (DateTime)

http://system.data.sqlite.org/

Of cource ich selbst die Daten auslesen kann mit der richtigen Datetime Umwandlung aber nicht so performant ist es als Lese

out über einen einfachen dt.Load()
 SQLiteCommand dbCommand = myConnector.CreateCommand(); 
     dbCommand.CommandText = "SELECT * FROM " + tablename; 

     SQLiteDataReader executeReader = dbCommand.ExecuteReader(CommandBehavior.SingleResult); 
     DataTable dt = new DataTable(); 
     dt.Load(executeReader); // <-- FormatException 

"bei System.DateTimeParse.ParseExactMultiple (String s, String [] Formate, Datetime dtfi, Datetimestyles style) \ r \ n bei System.D ateTime.ParseExact (String s, String [] Formate, IFormatProvider Provider, Datetimestyles style) \ r \ n bei System.Data.SQLite.SQLiteConvert.ToDateTime (String dateText, SQLiteDateFormats Format, Datetimekind Art) in c: \ dev \ sqlite \ dotnet \ System.Data.SQLite \ SQLiteConvert.cs: Zeile 322. "

Ich brauche eine gute Hilfe, um den aktuellen Code zu verbessern.

+0

nur eine Idee werfen ... in der Regel diese Art der Sache ist irgendwo versteckt (in einem Trigger vielleicht) ... Vielleicht ist die Logging-Mechanismen haben falsch formatierte Daten? Ich wette, das Problem besteht nicht darin, Ihre Abfrage in eine DataTable zu konvertieren, sondern es passiert etwas anderes. – Paul

+0

können Sie mir bitte das Format der beleidigenden DateTime-Spalte in der Tabelle – HatSoft

+0

sagen, die Beispieldatenbank ist dies: http://download.vive.net/Northwind.zip und die Tabelle ist 'ORDERS'. nach SQLite Database Browser sind die angreifenden Spalten vom Typ 'Zeitstempel' –

Antwort

13

Yep, stand ich das gleiche Problem, und ich habe eine Lösung gefunden.

Zuerst müssen Sie wissen, warum es passiert.

http://www.sqlite.org/datatype3.html

**

SQLite hat keine Speicherklasse vorbehaltene Daten speichern und/oder Zeiten. Stattdessen sind die integrierten Datums- und Zeit-Funktionen von SQLite der Lage Werte Datums- und Zeitangaben als TEXT, REAL oder INTEGER Speicherung:

**

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS"). 
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar. 
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. 

Anwendungen wählen können Speichern von Daten und Uhrzeiten in einem dieser Formate und frei zwischen den Formaten konvertieren mit dem eingebauten Datum und Zeitfunktionen.

Weitere Datum/Zeit-Funktionen können Sie diese Seite sehen: http://www.sqlite.org/lang_datefunc.html

LÖSUNG:

ist nur eine Datetime-Funktion benutzen, um Ihre Feld in eine gültige .NET Datentabelle zu konvertieren Format. Sie können jemand aus den obigen Link, in meinem Fall verwende ich wählen:

SELECT datetime(field) as field FROM table 

TIP 1 Wenn die Abfrage auf eine Sicht ist, und Sie können Ihre db nicht berühren, eine andere Ansicht erstellen oder so etwas, Sie sind in einem kleinen Problem, weil das Problem auf der db-Seite ist, wie ich vorher erkläre. Die erste Lösung ist also, die Spalte einer Datentabelle vor dem Laden zu ersetzen (etwas schmutzige Arbeit). Oder Sie können einen Unix-Stempel in einem Textfeld oder einen beliebigen Zeitstempel verwenden. Aber ich denke, die beste Lösung aus Ihrer Sicht erstellen Sie Ihre Abfrage auf Ihre Anwendung ist:

SELECT datetime(field) as field FROM view 

TIP 2

Sie auch vor dem SQLite Administrator und spielen mit Datetime-Funktionen ausprobieren können Überprüfen Sie das Format.

TIP 3

auch Ihre Kultur Globalisierung bewusst sein, können Sie ein Problem, wenn Sie die Kultur ändern finden. Versuchen Sie, Ihre Arbeit mit nur einer Software auszuführen und sie so anzuzeigen, wie Sie es möchten, nicht so, wie es die Kultur möchte. In meinem Land für zB verwenden wir als gemeinsames dieses Format: TT/MM/JJ und ist ein Schmerz, wie der Punkt auf Dezimalzahlen (wir verwenden ein Komma)

TIP 4

Wenn Sie arbeiten mit einer assistentendefinierten Verbindung für einen Bericht oder eine Entität oder Ähnliches. Überprüfen Sie das gewünschte Konvertierungsformat. Zum Beispiel verwende ich die häufigsten und nicht problematische Weise: ISO8601

SQLite - Add Connection

+0

Danke. Aber momentan habe ich keinen Weg gefunden. Ich bin ein Datenbank-Viewer, der die Datenbank nicht kennt. Das Standard-Datetime-Format ist 8601. Dies ist in meiner Tabelle, wenn ich 'executeReader.GetString (3)' = ** "7/4/1996 12:00:00 AM" ** mit 'executeReader.GetDateTime (3) 'Ich bekomme die FormatException –

+0

Ich meine, wie ist der Name Ihres Feldes? In Ihrem Code setzen Sie "SELECT * FROM Tabellenname. Versuchen Sie, diese Abfrage in SELECT Feld1, Feld2, Feld3, Feld4, Datenzeit (Feld), field6etc FROM Tabelle" zu ändern. Selbst ist eine nicht tolle Idee, eine SELECT * in einer App –

+0

übrigens, die Datetime, die Sie angeben, ist nicht ISO-konform –

0

See this publication über SQLite und DateTime Speicher, unter der Überschrift Speichern von DateTimes.

+0

danke, aber das ist keine Hilfe für mich. Dies ist eine weitere Erklärung meiner Situation. Aber ich speichere keine Daten, ich möchte sie nur lesen. –

+0

Benötigen Sie die DateTime-Spalte? Anstatt 'SELECT *' zu verwenden, könnten Sie die Spalten begrenzen und den DateTime-Wert einfach weglassen? Es klingt wie ein Formatproblem mit den Daten. – mgnoonan

2

Haben Sie versucht, mit SQLiteDataAdapter wie so ..

SQLiteDataAdapter da = new SQLiteDataAdapter(dbCommand); 
da.Fill(dt); 

Die Chancen stehen gut es das gleiche Verhalten, aber es tut nicht weh, zu versuchen;)

+0

nein es ist der gleiche Fehler –