2013-04-22 167 views
2

我正在使用SQLite数据库的C#WPF项目。我试图从sqlite数据库中的表中检索数据并添加到数据集,以便我可以将数据集添加到数据网格的项源。其中一列的是一个DateTime列,但我收到以下错误:使用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`)) 

感谢您提供任何帮助。

+0

我不确定,但那个名为'date'的列有点可疑。你可以尝试用方括号封装它吗? – Steve 2013-04-22 20:06:33

+0

不确定你的意思,以什么方式怀疑,以及方括号会实现什么 – Boardy 2013-04-22 20:07:29

+0

我怀疑它被解释为关键字,我的意思是'SELECT * FROM alarms ORDER BY [date]',实际上SQLite希望围绕关键字使用双引号但方括号被接受为兼容性,很容易写http://www.sqlite.org/lang_keywords.html – Steve 2013-04-22 20:09:57

回答

0

尝试这种方式

select * from alarms order by date(date) DESC 

看到documentation

0

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

显然,SQLite datetime到C#DateTime序列化映射并不完全正常。对我来说,这听起来就像日期时间以字符串形式返回,因此您需要在代码中执行DateTime.Parse()。在这个问题的答案之一中,它建议日期时间也需要被转换为nvarchar才能工作。

+0

谢谢,但我不认为这有帮助,因为他们在结果集上倾斜,因此他们可以操纵每个领域,我没有做,因为我只是把整个结果集放入数据集 – Boardy 2013-04-22 20:31:49

+0

我没有'在C#中处理数据集但是您是否还需要创建某种合同?像第1列是类型a并映射到我的数据集的第1列?如果是这种情况,我敢打赌你可以强迫那里的价值。其他.NET序列化方法(如Entity Framework)提供了这些功能,因此我认为数据集可能也有这些功能。 – evanmcdonnal 2013-04-22 21:22:24

0

这是两件事情之一:

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

  • 查询中的ORDER BY项出于某种原因阻止 SQLiteDataAdapter识别 列的正确类型。即使您按其他栏目排序,结果也会是 一样。为避免此问题,请删除订购条款(将 然后正确标识列数据类型),并在填充后对DataSet 进行排序。

编辑:在调查Ramesh的建议后,当使用Order by的“日期”功能时,我的第二点中列出的行为不再发生。

相关问题