記錄一下SQLite使用中踩過的坑

SQLite的簡介就不用贅敘了,總之,很輕便好用就對了。sql

第一坑數據庫

   首次使用SQLite總會碰到各類各樣的問題,首先,版本,項目開發的.net framework版本爲3.5.2   SQLite針對3.5版本的.net是有相應版本的,作項目時,沒有考慮SQLite版本問題,引用了dll文件以後發現項目運 行報錯,版本不符。 因此,必定要根據項目引用的.net版本去找System.Data.SQLite.dll.net

第二坑sqlite

   自增字段,SQLite也有自增字段的,只是用法跟SQLSERVER略有區別,好比建表時我要讓ID字段作主鍵且自增加,能夠這樣:blog

CREATE TABLE [TEST](
[ID] integer PRIMARY KEY autoincrement,
[Flag] [int] NULL,
[UserName] [nvarchar](50) NULL,
[CreateTime] [nvarchar](50) NULL,
[UpdateTime] datetime NULL
);開發

固定語法: integer PRIMARY KEY autoincrementrem

 

第三坑字符串

    時間類,接上文建表,咱們能夠看到CreateTime字段爲nvarchar類型,UpdateTime字段爲datetime類型。it

    先插入幾條數據看看:table

INSERT INTO TEST([Flag],[UserName],[CreateTime],[UpdateTime]) VALUES (1,'Tony','2020-04-19','2020-04-18');
INSERT INTO TEST([Flag],[UserName],[CreateTime],[UpdateTime]) VALUES (1,'Hrex','2020/4/19','2020-4-18');
INSERT INTO TEST([Flag],[UserName],[CreateTime],[UpdateTime]) VALUES (1,'Som','2020/04/19','2020/04/18');
INSERT INTO TEST([Flag],[UserName],[CreateTime],[UpdateTime]) VALUES (1,'Sun','2020-04-19','2020-04-18');
INSERT INTO TEST([Flag],[UserName],[CreateTime],[UpdateTime]) VALUES (1,'Ada','2020/04/19','2020-04-18');
INSERT INTO TEST([Flag],[UserName],[CreateTime],[UpdateTime]) VALUES (1,'Angel','2020年04月19','2020-04-18');

別問我爲何用這麼弱智的寫法,你也能夠用 ',' 隔開的寫法,隨意。

看看結果:

 

 

 嗯,貌似混進去了什麼奇怪的東西,這個1899年是什麼狀況,我明明寫的2020!

這就是須要注意的地方,SQLite插入時間字段時,若是是以字符串的方式插入,則必定要按照 ‘2020-04-19 21:30:00’ 這樣的格式來插入,不然就會出現圖中的狀況。

而後若是要取到系統當前時間,能夠這樣SELECT  datetime(CURRENT_TIMESTAMP,'localtime');

實際上,在SQLite裏,能夠用 varchar類型取代date類型,看這段:

SELECT USERNAME,CASE WHEN CREATETIME > UPDATETIME THEN CREATETIME
                                               WHEN CREATETIME <= UPDATETIME THEN UPDATETIME
                                               ELSE ''
                                     END AS [TIME]
FROM TEST

 

 

 SQLite中varchar類型徹底能夠進行時間類比較。

 

第四坑

    datetime類爲null的狀況:

INSERT INTO TEST([Flag],[UserName],[CreateTime],[UpdateTime]) VALUES (1,'Mata','2020-04-19',null);

而後 SELECT * FROM TEST;

 

 看起來沒有任何問題,可是,在VS中,執行查詢語句的時候,若是時間類字段爲null,就會報  "該字符串未被識別爲有效的 DateTime" !解決方法也很簡單,date類字段類型改成varchar類!或者向值爲null的date類字段插入值。

 

第五坑

   關於批量插入。SQLSERVER有個封裝方法SqlBulkCopy,此方法可用於將datatable中的大量數據存入數據庫,具體用法,面向百度就行,SQLite是沒有這個方法的,得本身寫循環去插入。

   其實還有個INSERT OR IGNORE INTO ,官方解釋是說能夠實現插入不重複數據,實測下來,這個sqlite-netFx35-setup-bundle-x64-2008-1.0.112.0版本的是不行的,仍然會插入重複。

相關文章
相關標籤/搜索