16

サンプルの Northwind sqlite データベースを読み込もうとしましたが、datetime を持ついくつかのテーブルでエラーが発生しました。これはデータベースの問題ですか、それとも System.Data.SQLite の問題ですか? 例外は次のようなものです:「文字列は有効な DateTime ではありません」

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

" System.DateTimeParse.ParseExactMultiple(String s、String[] フォーマット、DateTimeFormatInfo dtfi、DateTimeStyles スタイル)\r\n System.DateTime.ParseExact(String s、String[] フォーマット、IFormatProvider プロバイダ、DateTimeStyles スタイル)\r\ n bei System.Data.SQLite.SQLiteConvert.ToDateTime(String dateText, SQLiteDateFormats format, DateTimeKind kind) in c:\dev\sqlite\dotnet\System.Data.SQLite\SQLiteConvert.cs:Zeile 322."

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

4

3 に答える 3

13

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

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

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

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

ヒント3

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

ヒント4

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

SQLite-接続を追加

于 2012-07-27T16:36:27.513 に答える
4

そんな風にやってみましたかSQLiteDataAdapter

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

たぶんそれは同じように動作しますが、試してみても害はありません;)

于 2012-07-26T19:57:42.133 に答える
0

SQLite および DateTime ストレージに関するこの出版物を参照してください

于 2012-04-23T20:50:15.190 に答える