2

SQLite データベースを使用する C# WPF プロジェクトに取り組んでいます。sqlite データベース内のテーブルからデータを取得し、データ セットに追加して、データ グリッドのアイテム ソースにデータ セットを追加しようとしています。列の 1 つは DateTime 列ですが、次のエラーが発生します。

String was not recognized as a valid DateTime.

以下は、データを取得する方法です

private DataSet getAlarmsForSqlite()
        {
            DataSet ds = new DataSet();
            try
            {
                using (ConnectSQLiteDatabase db = new ConnectSQLiteDatabase(dbPassword))
                {
                    string query = "SELECT * FROM alarms ORDER BY date";
                    SQLiteDataAdapter da = new SQLiteDataAdapter(query, db.conn);
                    da.Fill(ds);
                }

            }
            catch (SQLiteException ex)
            {
                Console.WriteLine("Failed to get alarms. Sqlite Error: {0}", ex.Message);
                return null;
            }
            return ds;
        }

以下は、テーブルの作成ステートメントです

CREATE TABLE `alarms` (`id` int(11) NOT NULL, `date` datetime NOT NULL,
`type` varchar(50) NOT NULL,
`message` mediumtext NOT NULL, 
`level` varchar(45) NOT NULL, 
`page` varchar(500) NOT NULL, 
`acknowledged` char(1) DEFAULT '0', PRIMARY KEY (`id`))

ご協力いただきありがとうございます。

4

3 に答える 3

0

これは次の 2 つのいずれかです。

  • テーブル内のデータは、実際には SQLite が日時に変換できない形式になっています。最良の結果を得るには、ISO8601 日付形式「yyyy-MM-dd HH:mm:ss.FFFFFFF」を使用します。データをデータベースに書き込む前に変換する必要がありますが、データをデータセットに読み込むときに透過的に処理されます。

  • クエリの ORDER BY 用語は、何らかの理由で SQLiteDataAdapter が列の正しい型を識別できないようにしています。他の列で並べ替えても結果は同じです。この問題を回避するには、順序付け用語を削除し (これにより、列のデータ型が正しく識別されます)、入力後に DataSet を並べ替えます。

編集:Ramesh の推奨事項を調べた後、Order By で「日付」機能を使用すると、2 番目のポイントで説明した動作が発生しなくなりました。

于 2014-08-22T22:14:00.453 に答える
0

この方法を試してください

select *  from alarms order  by date(date) DESC

ドキュメントを参照してください。

于 2013-04-22T20:15:19.820 に答える
0

ここでは、この問題に関するいくつかの議論があります。「有効な日時として認識されない文字列」をスローするsqlite

どうやら SQLite の datetime から C# の DateTime シリアライゼーションへのマッピングは正確には機能しません。私には、日時が文字列として返されているように聞こえるのでDateTime.Parse()、コードで行う必要があります。その質問に対する回答の1つでは、datetimeを機能させるためにnvarcharにもキャストする必要があることを示唆しています。

于 2013-04-22T20:15:34.063 に答える