2009-03-04

System.Data.SQLite の GetDateTime でエラー  [by miyachi]

現在開発中のプロジェクトでSQLiteの.NET(C#)用の System.Data.SQLite を使っています。これらはアプリから簡易にデータベースを利用するオープンソースのプロジェクトです。SQL文を使って1つだけデータベースを開いて操作が出来るもので、軽くて使い方も簡単で初めて使いましたがなかなか便利です。(ただSQLをつかうのは久しぶりなものでちょっと最初だけ思い出すのに苦労しました(^^;;)

レコードの種類としてTIMESTAMP型があり、読み出す時には reader.GetDateTime() で取得できます。ところがINSERT時にはエラーになりませんがSELECTして GetDateTime() を実行すると例外になってしまいました。何でだろうと少しググると先人がやはりいらっしゃいました。でもまあ私も一応原因を書いておきましょう。

INSERT時には最初は DateTime.Now を使っていましたがこの場合に挿入される文字列は例えば "2009/03/04 18:00:00" となります。これが原因でした。挿入する文字列として "2009-03-04 18:00:00" とすればSELECT時にも例外は発生しません。 つまり日付の区切り文字を "/" から "-" に変更する必要があります。C#で書くなら、

 String timeStr
  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

と言う文字列を取得してINSERTすれば良いようです。これなら SQLiteDataReader の GetDateTime() で正しく日時が取得できます。この程度は通って欲しいけど互換性等の問題もあるのかもしれません。

余談ですが .NET用の System.Data.SQLite は、オリジナルのSQLiteのラッパーでは無く別途実装し直しているようです。なのでオリジナルのDLLファイルも不要になっています。安易に考えるとラッパーの方が楽とも思えますがマネージコードだけで済むようにしたかったんでしょうね。Monoでも動くようです。公開してくださっている皆様に感謝しつつ使わせて頂きます。
2009-03-04 18:28:52 - miyachi - - [プログラミング] -