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

时间:2013-04-22 19:57:59

标签: c# sqlite datetime

我正在使用一个使用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 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`))

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:0)

试试这种方式

select *  from alarms order  by date(date) DESC

请参阅documentation

答案 1 :(得分:0)

这里有一些关于这个问题的讨论; sqlite throwing a "String not recognized as a valid datetime"

显然SQLite日期时间到C#DateTime序列化映射并不完全有效。对我来说,听起来像日期时间以字符串形式返回,因此您需要在代码中执行DateTime.Parse()。在该问题的一个答案中,它表明日期时间也需要转换为nvarchar以便它可以工作。

答案 2 :(得分:0)

这是两件事之一:

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

  • 查询中的ORDER BY术语出于某种原因阻止了 SQLiteDataAdapter来识别正确的类型 柱。即使您按其他列排序,结果也是如此 相同。为避免此问题,请删除订购条款(将使用 然后正确识别列数据类型)并对DataSet进行排序 在它被填满之后。

编辑:在查看Ramesh的建议后,使用" date"使用Order By功能,我的第二点中概述的行为不再发生。