web-dev-qa-db-ja.com

SQLite ExecuteReader-> DataTable.Load-> FormatException(DateTime)

Northwind sqliteデータベースのサンプルを読み取ろうとしましたが、日時のある一部のテーブルでエラーが発生しました。これはデータベースまたは私のSystem.Data.SQLiteの問題ですか?例外は次のようなものです:「文字列は有効な日時ではありません」

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

当然のことながら、日時を正しく変換して自分でデータを読み取ることはできますが、これは単純な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 [] format、DateTimeFormatInfo dtfi、DateTimeStyles style)\ r\n bei System.DateTime.ParseExact(String s、String [] format、IFormatProvider provider、DateTimeStyles style)\ r\n bei System.Data.SQLite.SQLiteConvert.ToDateTime(String dateText、SQLiteDateFormats format、DateTimeKind kind)in c:\ dev\sqlite\dotnet\System.Data.SQLite\SQLiteConvert.cs:Zeile322。 "

現在のコードを改善するために良い助けが必要です。

15
masterchris_99

はい、私は同じ問題に直面しました、そして私は解決策を見つけました。

まず第一に、なぜそれが起こるのかを知る必要があります。

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

****

SQLiteには、日付や時刻を格納するためのストレージクラスがありません。代わりに、SQLiteの組み込みの日付と時刻関数は、日付と時刻をTEXT、REAL、またはINTEGERの値として格納できます。

****

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. 

アプリケーションは、これらの形式のいずれかで日付と時刻を保存し、組み込みの日付と時刻関数を使用して形式間で自由に変換することを選択できます。

その他の日付/時刻関数については、次のページを参照してください: http://www.sqlite.org/lang_datefunc.html

解決策:

日時関数を使用して、フィールドを有効な.NETデータテーブル形式に変換するだけです。私の場合、上記のリンクから誰でも使用できます。

SELECT datetime(field) as field FROM table

ヒント1クエリがビュー上にあり、データベースに触れることができない場合は、作成します別の見方などですが、前に説明したように、問題はデータベース側にあるため、少し問題があります。したがって、最初の解決策は、ロードする前にデータテーブルの列を置き換えることです(少し汚い作業)。または、テキストフィールドまたは任意のタイムスタンプにUnixスタンプを使用できます。しかし、最善の解決策は、自分の視点からアプリケーションにクエリを作成することだと思います。

SELECT datetime(field) as field FROM view

ヒント2

SQLite Administratorで試して、フォーマットを確認する前に日時関数を試すこともできます。

ヒント3

文化のグローバル化にも注意してください。文化を変えると問題が発生する可能性があります。文化が望むようにではなく、1つだけでソフトワークを試して、好きなように表示してください。たとえば私の国では、dd/MM/yyという形式を一般的に使用しており、10進数のドットのように苦痛です(コンマを使用します)

ヒント4

レポートやエンティティなどでウィザード定義の接続を使用している場合は、目的の変換形式を必ず確認してください。たとえば、私は最も一般的で問題のない方法を使用します:ISO8601

SQLite - Add Connection

13
Leandro

SQLiteDataAdapterで試してみましたか。

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

同じように動作する可能性がありますが、試してみても問題はありません;)

3
banging

この出版物を参照 SQLiteおよびDateTimeストレージについて、Storing DateTimesという見出しの下。

0
mgnoonan