C# 用Sqlite数据库填充包含DateTime列的数据集
我正在从事一个使用SQLite数据库的C WPF项目。我正在尝试从sqlite数据库中的表中检索数据,并将其添加到数据集,以便将数据集添加到数据网格的items源中。其中一列是DateTime列,但我发现以下错误:C# 用Sqlite数据库填充包含DateTime列的数据集,c#,sqlite,datetime,C#,Sqlite,Datetime,我正在从事一个使用SQLite数据库的C WPF项目。我正在尝试从sqlite数据库中的表中检索数据,并将其添加到数据集,以便将数据集添加到数据网格的items源中。其中一列是DateTime列,但我发现以下错误: String was not recognized as a valid DateTime. 下面是我如何检索数据的 private DataSet getAlarmsForSqlite() { DataSet ds = new DataSe
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`))
谢谢你能提供的帮助 这样试试
select * from alarms order by date(date) DESC
参见。这里有一些关于这个问题的讨论
显然,SQLite datetime到C datetime的序列化映射并不完全有效。对我来说,这听起来像是datetime以字符串的形式返回,所以您需要在代码中执行datetime.Parse。在该问题的一个答案中,它表明日期时间也需要转换为nvarchar才能工作。这是两件事之一: 表中的数据的格式实际上与SQLite不同 能够变成一个日期时间。为了获得最佳效果,请使用 ISO8601日期格式yyyy MM dd HH:MM:ss.FFFFFFF。它需要 在将数据写入数据库之前进行转换,但是 将数据读回数据集时透明地处理 查询中的ORDER BY term出于某种原因阻止了 SQLiteDataAdapter无法识别 柱即使按其他列排序,结果也将是 相同的。为避免此问题,请删除将 然后正确识别列数据类型并对数据集进行排序 在它被填满之后
编辑:在研究了Ramesh的推荐之后,当使用带有Order By的date函数时,我在第二点中概述的行为不再发生。我不确定,但名为date的列有点可疑。你能试着用方括号把它封装起来吗?不确定你的意思,怀疑以什么方式,方括号会起什么作用我怀疑这是一个关键字,我的意思是按[日期]从报警顺序选择*,实际上SQLite希望在关键字周围加上双引号,但为了兼容性,方括号是可以接受的,而且很容易编写。啊,好吧,试过了,但仍然没有成功。我不认为order by though是datetime错误发生的原因。您的代码似乎绝对合法,也许该列中有一些无效的datetime。您可以尝试使用DataReader进行调试,并在数据中循环,直到得到错误。谢谢,但我认为这没有帮助,因为这个问题他们正在删除结果集,以便他们可以操作每个字段,而我没有这样做,因为我只是将整个结果集放入数据集。我没有在C中处理数据集,但您不是吗还需要创建某种合同吗?像列1是类型a并映射到我的数据集的列1?如果是这样的话,我打赌你可以强制那里的值。其他.NET序列化方法(如Entity Framework)提供了这些功能,因此我认为数据集也可能具有这些功能。