Sqlite DateTime 類型 讀取和寫入格式 注意的問題
今天遇到個問題.
首先插入一個DataTime格式的數(shù)據(jù):
string sql="insert into [table] (date_time) values('" + date_time.ToString() + "'";
執(zhí)行如上命令.插入沒有報告錯誤.
但是,我又用一條命令讀取時:
string sql="select * from [table];
.....
IDataReader dr=cmd.ExecuteReader();
...
object obj=dr["data_time"];//在這里出錯了,說是無法轉(zhuǎn)換為DataTime格式,字符串不正確
--------------------------------------------------------------------------------------------
我找了一天的教程,找了一天的google.
答案是:sqlite用的全球時間UTC,要用datetime()函數(shù)轉(zhuǎn)換若干.
我也試了,發(fā)現(xiàn)好像運行的不像教程上說的那樣!
實在沒辦法,來硬的吧,硬著頭皮看源代碼吧.
他的繼承格式大致如下:
SqliteConvert-->SqliteBase-->Sqlite3
在SqliteConvert中定義了轉(zhuǎn)換格式,上面說的很明白,默認DataTime格式為 ISO8601
然后,SqliteConnection 用到了Sqlite3.
我就研究了SqliteConnection的源代碼,發(fā)現(xiàn)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有什么關(guān)鍵作用,反正Access,MySql,MsSql都沒這問題的)
我又在想,如果我用一個T會如何?
就嘗試.用data_time.ToString("s");這種方法轉(zhuǎn)換成 iso 8601標準字符串格式
結(jié)果我吃屎吃了個醬板頭(無錫話,意思是運氣好),竟然成功了.
如下:
string sql="insert into [table] (date_time)" values('" + date_time.ToString("s") + "'";
這樣,問題就解決了,希望大家能夠看到此貼,并發(fā)揚光大,到處流傳,這樣才能發(fā)展Sqlite的普及率.
附注:
我起先研究了BBSMAX的Sqlite數(shù)據(jù)庫.我認為這個論壇會有好的解決方法.
但我錯了.其實沒有.bbsMax用了varchar代替DateTime格式.
我也照做了,但是當(dāng)我用到 select * from [table] where date_time > '2006-1-1' and date_time< '2008-1-1'
類似這樣的語句,想查詢一個中間的時間類型時,語法錯誤.
所以,到頭來,我還是從頭開始研究DateTime格式.字符串格式雖然能夠湊合,但是卻沒有那么方便和強大.
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
首先插入一個DataTime格式的數(shù)據(jù):
string sql="insert into [table] (date_time) values('" + date_time.ToString() + "'";
執(zhí)行如上命令.插入沒有報告錯誤.
但是,我又用一條命令讀取時:
string sql="select * from [table];
.....
IDataReader dr=cmd.ExecuteReader();
...
object obj=dr["data_time"];//在這里出錯了,說是無法轉(zhuǎn)換為DataTime格式,字符串不正確
--------------------------------------------------------------------------------------------
我找了一天的教程,找了一天的google.
答案是:sqlite用的全球時間UTC,要用datetime()函數(shù)轉(zhuǎn)換若干.
我也試了,發(fā)現(xiàn)好像運行的不像教程上說的那樣!
實在沒辦法,來硬的吧,硬著頭皮看源代碼吧.
他的繼承格式大致如下:
SqliteConvert-->SqliteBase-->Sqlite3
在SqliteConvert中定義了轉(zhuǎn)換格式,上面說的很明白,默認DataTime格式為 ISO8601
然后,SqliteConnection 用到了Sqlite3.
我就研究了SqliteConnection的源代碼,發(fā)現(xiàn)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有什么關(guān)鍵作用,反正Access,MySql,MsSql都沒這問題的)
我又在想,如果我用一個T會如何?
就嘗試.用data_time.ToString("s");這種方法轉(zhuǎn)換成 iso 8601標準字符串格式
結(jié)果我吃屎吃了個醬板頭(無錫話,意思是運氣好),竟然成功了.
如下:
string sql="insert into [table] (date_time)" values('" + date_time.ToString("s") + "'";
這樣,問題就解決了,希望大家能夠看到此貼,并發(fā)揚光大,到處流傳,這樣才能發(fā)展Sqlite的普及率.
附注:
我起先研究了BBSMAX的Sqlite數(shù)據(jù)庫.我認為這個論壇會有好的解決方法.
但我錯了.其實沒有.bbsMax用了varchar代替DateTime格式.
我也照做了,但是當(dāng)我用到 select * from [table] where date_time > '2006-1-1' and date_time< '2008-1-1'
類似這樣的語句,想查詢一個中間的時間類型時,語法錯誤.
所以,到頭來,我還是從頭開始研究DateTime格式.字符串格式雖然能夠湊合,但是卻沒有那么方便和強大.
《Android開發(fā)完全講義(第2版)》(本書版權(quán)已輸出到臺灣)
http://product.dangdang.com/product.aspx?product_id=22741502
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2009-08-18 17:58 銀河使者 閱讀(3091) 評論(0) 編輯 收藏 所屬分類: databases