2012-04-23 35 views
15

我試着讀出一個示例Northwind sqlite數據庫,但在某些帶有日期時間表的表上發生錯誤。這是數據庫還是我的System.Data.SQLite的問題? 例外的是像事端:「該字符串不是有效的日期時間」SQLite ExecuteReader - > DataTable.Load - > FormatException(DateTime)

http://system.data.sqlite.org/

五言我可以自己用正確的轉換日期時間的讀出的數據,但是這並不像高性能的讀它出通過一個簡單的dt.Load()

 SQLiteCommand dbCommand = myConnector.CreateCommand(); 
     dbCommand.CommandText = "SELECT * FROM " + tablename; 

     SQLiteDataReader executeReader = dbCommand.ExecuteReader(CommandBehavior.SingleResult); 
     DataTable dt = new DataTable(); 
     dt.Load(executeReader); // <-- FormatException 

「被System.DateTimeParse.ParseExactMultiple(字符串s字符串[] 格式,的DateTimeFormatInfo dtfi,DateTimeStyles風格個)\ r \ n貝 System.D ateTime.ParseExact(字符串s字符串[]格式,的IFormatProvider 提供商,DateTimeStyles風格個)\ r \ n貝 System.Data.SQLite.SQLiteConvert.ToDateTime(字符串dateText, SQLiteDateFormats格式,DateTimeKind那種)在 C:\ dev \ sqlite \ dotnet \ System.Data.SQLite \ SQLiteConvert.cs:Zeile 322.「

我需要一個很好的幫助來改善當前的代碼。

+0

只是拋出一個想法...通常這種類型的東西被隱藏的地方(在觸發也許)......也許日誌機制有錯誤地格式化日期?我敢打賭,問題不在於將查詢轉換爲DataTable,而是發生其他事情。 – Paul 2012-07-26 19:28:27

+0

請你能告訴我在表 – HatSoft 2012-07-26 20:49:43

+0

有問題的DateTime列的格式樣本數據庫是這樣的:http://download.vive.net/Northwind.zip和表是'ORDERS'。根據SQLite數據庫瀏覽器的有問題的列是從類型'時間戳' – 2012-07-26 21:02:45

回答

13

是的,我面臨同樣的問題,我已經找到了解決方案。

首先你需要知道它爲什麼會發生。

http://www.sqlite.org/datatype3.html

**

SQLite沒有存儲類,用於存儲日期 和/或時間預留。取而代之的是,SQLite的 的內置日期和時間函數能夠存儲日期和時間爲TEXT,REAL或INTEGER 值:

**

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS"). 
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar. 
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. 

應用程序可以選擇以這些 格式中的任何一種存儲日期和時間,並使用內置日期和 時間函數在格式間自由轉換。

更多的日期/時間的功能,你可以看到這個頁面: http://www.sqlite.org/lang_datefunc.html

SOLUTION:

只是使用日期時間函數你的領域轉化爲有效的.NET數據表格式。您可以使用任何來自上面的鏈接,在我的情況,我選擇:

SELECT datetime(field) as field FROM table 

TIP 1 如果您的查詢是一個視圖,你不能碰您的數據庫,建立了不同的看法或者類似的東西,你會遇到一些麻煩,因爲問題出在我之前解釋的db端。所以第一個解決方案是在加載之前替換一個數據表的列(有點骯髒的工作)。或者,您可以在文本字段或任何期望的時間戳上使用Unix戳記。 但我認爲最好的辦法是在你的應用程序從您的視圖中創建查詢:

SELECT datetime(field) as field FROM view 

TIP 2

您可以使用SQLite的管理員也嘗試之前,日期時間的功能發揮檢查格式。

TIP 3

要知道你的文化全球化也,你可以,如果你改變文化發現問題。嘗試只使用一種柔軟工作,並按需要展示,而不是像文化要的那樣。在我的國家爲例如,我們用共同的格式如下:DD/MM/YY,是一種痛苦,像十進制數點(我們使用逗號)

TIP 4

如果您正在使用某個報告或實體或類似的嚮導定義的連接,請務必檢查您所需的轉換格式。比如我用的是最常見的和非問題的方式:ISO8601

SQLite - Add Connection

+0

謝謝。但目前我找不到方法。我是一個不知道數據庫的數據庫查看器。默認的日期時間格式是8601.當我執行'executeReader.GetString(3)'= **「7/4/1996 12:00:00 AM」** with'executeReader.GetDateTime(3) '我得到FormatException – 2012-07-28 06:43:15

+0

我的意思是你的領域的名字是什麼?在你的代碼中,你放置了「SELECT * FROM tablename」,試着將這個查詢改爲SELECT field1,field2,field3,field4,datatime(field),field6etc FROM table「。即使是不是一個好主意順便做一個SELECT *應用程序 – 2012-07-30 13:11:46

+0

,您指定的日期時間不符合iso – 2012-07-30 13:14:41

0

See this publication關於SQLite和DateTime存儲,標題爲存儲日期時間

+0

謝謝,但這對我沒有幫助。這是對我的情況的進一步解釋。但是我不存儲任何我只想讀出來的數據。 – 2012-04-24 04:56:33

+0

你需要DateTime列嗎?而不是做'SELECT *',你可以限制這些列而忽略DateTime值?這聽起來像是數據的格式問題。 – mgnoonan 2012-04-24 15:01:10

2

你有沒有試着用SQLiteDataAdapter像這樣..

SQLiteDataAdapter da = new SQLiteDataAdapter(dbCommand); 
da.Fill(dt); 

機會是它的行爲相同,但它不會傷害嘗試;)

+0

不,這是相同的錯誤 – 2012-07-26 20:15:51

相關問題