记录一下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版本的是不行的,仍然会插入重复。

相关文章
相关标签/搜索