15

私はSqliteで遊んでいて、いくつかのテストデータを読み戻そうとするとエラーが発生し続けます。たとえば、次のように、単一のテーブルといくつかの列を持つ単純なdbを作成し、いくつかのテストデータを入力しました。

sqlite> .schema
CREATE TABLE "shows"(id integer primary key asc autoincrement, showName TEXT, guest TEXT, dateAired date, dateWatched date);

sqlite> select * from shows;
6|test show|test guest 1|2012.05.01|2012.07.10
7|test show|test guest 2|2012.05.02|2012.07.10
8|test show|test guest 4|2012.05.04|2012.07.10

ここで利用できるSystem.Data.Sqliteライブラリを使用していますが、日付列を読み取ろうとするとエラーが発生し続けます。日付をdd-MM-yyyy形式で入力しようとしましたが、「文字列が有効な日時として認識されていません」というエラーが表示されます。DateTime.Parseを使用するか、datetimeにキャストするか、ToString()を実行して何が起こるかを確認しようとしましたが、同じエラーが発生し続けます。テキストフィールドは正常に読み取ることができますが、日付フィールドは読み取ることができません。

切り取ったC#コードを以下に示します

var sqliteConn = new SQLiteConnection("Data Source=data/shows.db;Version=3;New=False;Compress=True");
sqliteConn.Open();
SQLiteCommand cmd = new SQLiteCommand(sqliteConn);
cmd.CommandText = "select * from shows";

SQLiteDataReader reader = cmd.ExecuteReader( );
while (reader.Read( ))
    {
    var showName = reader["showName"];
    // This is where it keeps giving me an error.
    // I have tried various things such as DateTime.Parse
    var airedDate = DateTime.ParseExact("yyyy.MM.dd", reader["dateAired"].ToString(), new CultureInfo("en-AU"));
     }
reader.Close( );

どんな助けでも大歓迎です。

よろしく、

4

5 に答える 5

29

このスレッドの議論に基づいて、「datetimeformat」パラメーターを使用して接続文字列を作成することにし、「文字列が有効な日時として認識されない」問題が解決されました。

私の接続文字列の例:

source=<source to db file>;version=3;new=False;datetimeformat=CurrentCulture

この機能は、2013 年 7 月 8 日にバージョン 1.0.87.0 でリリースされました (リリース ノートを参照) 。

于 2014-10-23T21:13:42.687 に答える
10

このスレッドは少し古いかもしれませんが、同じ問題に遭遇し、「解決策」を見つけました。

DateTimeSystem.Data.SQLite がs を正しく処理していないようです。データベースでフォーマット(mm/dd/yyyy)を試してみましたが、日付の列をDateTime.ParseExact呼び出すだけでエラーが発生することに気付きました。に合わせようとしていたのではなく、 として読み取らせたので、これは奇妙に思えました。ToString()DataReaderDateString

このため、データベースから呼び出していたビューに戻り、すべての日付をCAST as nvarchar(10). このようにして、データベースは日付ではなく文字列を返します。さて、DateTime.Parseうまくいきました!

ビューでトリガーを使用して文字列/日付を取得し、基になるテーブルを挿入/更新します。これにより、すべての変換が System.Data.SQLite ではなくデータベースで行われます。

2012 年 12 月に System.Data.SQLite の新しいバージョンがリリースされる予定です。これが解決されることを願っています。

于 2012-11-14T16:22:52.797 に答える
0

接続用の文字列を変更してもうまくいきませんでしたが、トリガーのアイデアはこのように使用するのに役立ちます

"Select Cast("Coulname" as nvarchar(20)) From "Table Name"

于 2020-01-27T11:46:12.560 に答える