2013-04-22 155 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的「日期」功能時,我的第二點中列出的行爲不再發生。