今天遇到個問題.
首先插入一個DataTime格式的資料:
string sql="insert into [table] (date_time) values('" + date_time.ToString() + "'";
執行如上命令.插入沒有報告錯誤.
但是,我又用一條命令讀取時:
string sql="select * from [table];.....IDataReader dr=cmd.ExecuteReader();...
object obj=dr["data_time"];//在這裡出錯了,說是無法轉換為DataTime格式,字 符串不正確
------------------------------------------------------------------- -------------------------
我找了一天的教程,找了一天的google.
答案是:sqlite用的全球時間UTC,要用datetime()函數轉換若干.
我也試了,發現好像啟動並執行不像教程上說的那樣!
實在沒辦法,來硬的吧,硬著頭皮看原始碼吧.
他的繼承格式大致如下:
SqliteConvert-->SqliteBase-->Sqlite3
在SqliteConvert中定義了轉換格式,上面說的很明白,預設DataTime格式為 ISO8601
然後,SqliteConnection 用到了Sqlite3.
我就研究了SqliteConnection的原始碼,發現Sqlite不是用的什麼全球的UTC時 間.
其實就是用的國際標準ISO 8601標準.
那我就著手看怎麼才能讓我的程式和sqlite相容.
我產生的字串和sqlite的有什麼不同.
最後看了msdn上對iso 8601的描述:(http://msdn.microsoft.com/zh- cn/library/ms187819.aspx)
給出了字串樣本:
* 2004-05-23T14:25:10
* 2004-05-23T14:25:10.487
而我產生的字串 data_time.ToString()和他的有一個不同的地方.
就是沒有那個T....(其實我也不明白那個T有什麼關鍵作用,反正 Access,MySql,MsSql都沒這問題的)
我又在想,如果我用一個T會如何?
就嘗試.用data_time.ToString("s");這種方法轉換成 iso 8601標準字串格 式
結果我吃屎吃了個醬板頭(無錫話,意思是運氣好),竟然成功了.
如下:
string sql="insert into [table] (date_time)" values('" + date_time.ToString("s") + "'";
這樣,問題就解決了,希望大家能夠看到此貼,並發揚光大,到處流傳,這樣才能 發展Sqlite的普及率.
附註:
我起先研究了BBSMAX的Sqlite資料庫.我認為這個論壇會有好的解決方案.
但我錯了.其實沒有.bbsMax用了varchar代替DateTime格式.
我也照做了,但是當我用到 select * from [table] where date_time > '2006-1-1' and date_time< '2008-1-1'
類似這樣的語句,想查詢一個中間的時間類型時,語法錯誤.
所以,到頭來,我還是從頭開始研究DateTime格式.字串格式雖然能夠湊合,但 是卻沒有那麼方便和強大.