用Sqlite数据库填充包含DateTime列的DataSet

本文关键字:DateTime 列的 DataSet 包含 填充 Sqlite 数据库 | 更新日期: 2023-09-27 18:10:35

我正在做一个使用SQLite数据库的c# WPF项目。我正在尝试从sqlite数据库中的表中检索数据,并添加到数据集,这样我就可以将数据集添加到数据网格的项目源。其中一列是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语句
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`))

谢谢你能提供的任何帮助。

用Sqlite数据库填充包含DateTime列的DataSet

试试这个

select *  from alarms order  by date(date) DESC

这里有一些关于这个问题的讨论;sqlite抛出一个"无法识别为有效日期时间"的字符串

显然SQLite的datetime到c#的datetime序列化映射不完全工作。对我来说,这听起来像是datetime作为一个字符串回来,所以你需要在你的代码中做DateTime.Parse()。在这个问题的一个答案中,它建议datetime也需要被强制转换为nvarchar,以便它工作。

这是两件事之一:

  • 表中的数据实际上是SQLite不是的格式能够变成一个约会时间。为获得最佳效果,请使用ISO8601日期格式为"yyyy-MM-dd HH:mm:ss.FFFFFFF"。它需要在将数据写入数据库之前进行转换,但是

  • 由于某种原因,查询中的ORDER BY项阻止了的正确类型列。即使你按其他列排序,结果也是相同的。为了避免这个问题,删除排序项(它将然后正确识别列数据类型)并对数据集进行排序

编辑:在研究了Ramesh的建议后,当使用Order By的"日期"函数时,我在第二点中概述的行为不再发生。