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版本的是不行的,仍然會插入重複。