【网学网提醒】:网学会员为广大网友收集整理了,SQLLiter语法大全,希望对大家有所帮助!
一.如何获取SQLite最新版本
官方站点:sqlite.org/
从sqlite.org/网站的Download页面获取
即如下页面下载
sqlite.org/download.html
blog.csdn.net/littletigerat
二.Windows下的SQLite的源代码是哪个软件压缩包?
sqlite-amalgamation-3_6_22.zip是SQLite的windows下源码文件
三.Window下的SQLite命令行工具
sqlite-3_6_22.zip
四.Window下的SQLite开发库,即动态链接库以及DEF文件
sqlitedll-3_6_22.zip
五.SQLite最新版本是:3.6.22
六.b<=a&;&;a<=c的SQL语句如何写
在SQLite中,表达式"aBETWEENbANDc"等于表达式"a>=bANDa<=c",在比较表达式时,a可以是具有任何亲和性
七.a的值是x,y,z其中一个值,SQL语句如何写
SQLite把表达式"aIN(x,y,z)"和"a=zORa=yORa=z"视为相等.
八.如何创建制定目录的数据库
sqlite3D:\Project\SyncML\Lib\debug\atsync.db
九.创建数据的注意事项
如果不往数据库里面添加任何的表,这个数据库等于没有建立,不会在硬盘上产生任何文件,如果数据库已经存在,则会打开这个数据库。
十.如何添加一张数据表
createtablestudent(namevarchar(10),agesmallint);
十一.如何往数据表中添加数据
insertintostudentvalues('张三',20);
十二.如何通过sqlite3.dll与sqlite3.def生成sqlite3.lib文件
LIB/DEF:sqlite3.def/machine:IX86
十三.如何查询SQLite工具的软件版本
也就是sqlite3.exe应用程序小工具的版本号
方法一:进入sqlite3.exe所在目录,在命令行执行如下命令
sqlite3–version
方法二:
selectsqlite_version();
十四.如何在字符串中使用单引号(')?
SQL标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号
十五.如果删除了大量数据,而又想缩小数据库文件占用的空间,执行VACUUM命令
vacuum;
十六.在SQLite中,如何在一个表上添加或删除一列?
SQLite有有限地ALTERTABLE支持。你可以使用它来在表的末尾增加一列,可更改表的名称。如果需要对表结构做更复杂的改变,则必须重新建表。重建时可以先将已存在的数据放到一个临时表中,删除原表,创建新表,然后将数据从临时表中复制回来。
如,假设有一个t1表,其中有"a","b","c"三列,如果要删除列c,以下过程描述如何做:
开始事物处理
BEGINTRANSACTION;
创建临时表格t1-backup
CREATETEMPORARYTABLEt1_backup(a,b);
将数据库表t1中的所有数据拷贝到表t1-backup中
INSERTINTOt1_backupSELECTa,bFROMt1;
删除表格t1
DROPTABLEt1;
创建表格t1
CREATETABLEt1(a,b);
将数据库表t1-backup中的所有数据拷贝到表t1中
INSERTINTOt1SELECTa,bFROMt1_backu
p;
删除备份表格t1-backup
DROPTABLEt1_backup;
事物提交
COMMIT;
十七.如何查询当前的编码的编码格式
pragmaencoding;
十八.SQLite支持哪些数据类型些?
NULL值为NULL
INTEGER值为带符号的整型,根据类别用1,2,3,4,6,8字节存储
REAL值为浮点型,8字节存储
TEXT值为text字符串,使用数据库编码(UTF-8,UTF-16BEorUTF-16-LE)存储
BLOB值为二进制数据,具体看实际输入
但实际上,sqlite3也接受如下的数据类型:
smallint16位元的整数
interger32位元的整数
decimal(p,s)p精确值和s大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为p=5;s=0。
float32位元的实数。
double64位元的实数。
char(n)n长度的字串,n不能超过254。
varchar(n)长度不固定且其最大长度为n的字串,n不能超过4000。
graphic(n)和char(n)一样,不过其单位是两个字元double-bytes,n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)可变长度且其最大长度为n的双字元字串,n不能超过2000。
date包含了年份、月份、日期。
time包含了小时、分钟、秒。
timestamp包含了年、月、日、时、分、秒、千分之一秒。
十九.如果将某个字段设置为INTEGERPRIMARYKEY属性,有什么特性?
如果将声明表的一列设置为INTEGERPRIMARYKEY,则具有:
1.每当你在该列上插入一NULL值时,NULL自动被转换为一个比该列中最大值大1的一个整数;
2.如果表是空的,将会是1;
注意该整数会比表中该列上的插入之前的最大值大1。该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在INTEGERPRIMARYKEY上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。
二十.字段声明中有AUTOINCREMENT属性,有什么与众不同的含义?
要想建立在整个表的生命周期中唯一的键值,需要在INTEGERPRIMARYKEY上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。
2010年SQLite学习笔记之二
一.建立数据库
sqlite3.exetest.db
二.双击sqlite-3_6_16目录下的程序sqlite3.exe,即可运行
三.退出
.exit
或者
.quit
四.SQLite支持如下5种数据类型
1.NULL:空值。
2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。
3.REAL:浮点数字,存储为8-byteIEEE浮点数。
4.TEXT:字符串文本。
5.BLOB:二进制对象。
五.联系人表格结构如下
createtablecontact(idintegerprimarykeyautoincrement,
lastnamevarchar
(20),firstnamevarchar(20),
mobilevarchar(30),telephonevarchar(20),
emailvarchar(30),companyvarchar(50),
departmentvarchar(16),addressvarchar(80),
id1interger,id2integer,updatetimedatetime);
六.查看数据库有哪些数据表
命令是:.tables
七.如何插入一条记录
insertintocontact(lastname,firstname,mobile,telephone,updatetime)values('刘','畅','13910128132','010-81749136','2009-07-22');
八.查看数据表的结构
针对整个数据库
.schema
针对仅仅是contact联系人该表
.schemacontact注意没有分号
九.如何打开一个已经创建的数据库
sqlite3test.db
十.如何解决如下问题
SQLerror:near"sqlite3":syntaxerror
SQL指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,sqlite3会略过去
十一.如何建立索引
createindexindex_nameontable_name(field_to_be_indexed);
十二.如何删除一张数据表
droptablecontact;
十三.查看当前的数据库
.database
十四.如何删除一个数据表的数据
deletefromcontact;
十五.如何导入一个文件到某个表中
.import文件路径表名
注意这是非SQL语句,所以不加分号
十六.如何设置文件字段的分隔符
.separator“,”
.importe:/contact.txtcontact
十七.如何查看当前sqllite字段的分隔符是什么?
.show
十八.如何将查询结果导出到一个文件
第一步:.outputa.txt
第二步:执行要导出的SQL语句
第三步:.outputstdout
十九.SQL查询语句
select*fromfilmorderbyyearlimit10;
select*fromfilmorderbyyeardesclimit10;
selectcount(*)fromfilm;
select*fromfilmwherestarringlike'Jodie%';
select*fromfilmwherestarring='JodieFoster';
selecttitle,yearfromfilmorderbyyeardesclimit10;
selectcolumnsfromtable_namewhereexpression;
最常见的用法,当然是倒出所有数据库的内容:
select*fromfilm;
如果资料太多了,我们或许会想限制笔数:
select*fromfilmlimit10;
或是照着电影年份来排列:
select*fromfilmorderbyyearlimit10;
或是年份比较近的电影先列出来:
select*fromfilmorderbyyeardesclimit10;
或是我们只想看电影名称跟年份:
selecttitle,yearfromfilmorderbyyeardesclimit10;
查所有茱蒂佛斯特演过的电影:
select*fromfilmwherestarring='JodieFoster';
查所有演员名字开头叫茱蒂的电影('%'符号便是SQL的万用字符):
select*fromfilmwherestarringlike'Jodie%';
查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影名称和年份:
selecttitle,yearfromfilmwherestarringlike'Jodie%'andyear>=1985orderbyyeardesclimit10;
有时候我们只想知道数据库一共有多
少笔资料:
selectcount(*)fromfilm;
有时候我们只想知道1985年以后的电影有几部:
selectcount(*)fromfilmwhereyear>=1985;
(进一步的各种组合,要去看SQL专书,不过你大概已经知道SQL为什么这么流行了:这种语言允许你将各种查询条件组合在一起──而我们还没提到「跨数据库的联合查询」呢!)
如何更改或删除资料
了解select的用法非常重要,因为要在sqlite更改或删除一笔资料,也是靠同样的语法。
例如有一笔资料的名字打错了:
updatefilmsetstarring='JodieFoster'wherestarring='JodeeFoster';
就会把主角字段里,被打成'JodeeFoster'的那笔(或多笔)资料,改回成JodieFoster。
deletefromfilmwhereyear<1970;
就会删除所有年代早于1970年(不含)的电影了。
其他sqlite的特别用法
sqlite可以在shell底下直接执行命令:
sqlite3film.db"select*fromfilm;"
输出HTML表格:
sqlite3-htmlfilm.db"select*fromfilm;"
将数据库「倒出来」:
sqlite3film.db".dump">output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):
sqlite3film.db
在大量插入资料时,你可能会需要先打这个指令:
begin;
插入完资料后要记得打这个指令,资料才会写进数据库中:
commit;
创建数据库文件:
>SQLite3d:\test.db回车
就生成了一个test.db在d盘。
这样同时也SQLite3挂上了这个test.db
2)
用.help可以看看有什么命令
>.help回车即可
3)可以在这里直接输入SQL语句创建表格用;结束,然后回车就可以看到了
4)看看有创建了多少表
>.tables
5)看表结构
>.schema表名
6)看看目前的数据库
>.database
7)如果要把查询输出到文件
>.output文件名
>查询语句;
查询结果就输出到了文件c:\query.txt
把查询结果用屏幕输出
>.outputstdout
8)把表结构输出,同时索引也会输出
.dump表名
9)退出
>.exit或者.quit
2。从sqlite.phxsoftware/下载Ado.net驱动。
下载了安装,在安装目录中存在System.Data.SQLite.dll
我们只需要拷贝这个文件到引用目录,并添加引用即可对SQLite数据库操作了
所有的Ado.net对象都是以SQLite开头的,比如SQLiteConnection
连接串只需要如下方式
DataSource=d:\test.db或者DataSource=test.db--应用在和应用程序或者.net能够自动找到的目录
剩下的就很简单了~~
3。SQL语法
由于以前用SQLServer或者ISeries,所以DDL的语法很汗颜
1)创建一个单个PrimaryKey的table
CREATETABLE[Admin](
[UserName][nvarchar](20)PRIMARYKEYNOTNULL,
[Password][nvarchar](50)NOTNULL,
[Rank][smallint]
NOTNULL,
[MailServer][nvarchar](50)NOTNULL,
[MailUser][nvarchar](50)NOTNULL,
[MailPassword][nvarchar](50)NOTNULL,
[Mail][nvarchar](50)NOTNULL
);
2)创建一个多个PrimaryKey的table
CREATETABLE[CodeDetail](
[CdType][nvarchar](10)NOTNULL,
[CdCode][nvarchar](20)NOTNULL,
[CdString1][ntext]NOTNULL,
[CdString2][ntext]NOTNULL,
[CdString3][ntext]NOTNULL,
PRIMARYKEY(CdType,CdCode)
);
3)创建索引
CREATEINDEX[IX_Account]ON[Account]([IsCheck],[UserName]);
还可以视图等等。
4.还有很有用的SQL
Select*fromSqlite_master
Selectdatetime('now')
Selectdate('now')
Selecttime('now')
SQLite内建函数表
算术函数
abs(X)
返回给定数字表达式的绝对值。
max(X,Y[,...])
返回表达式的最大值。
min(X,Y[,...])
返回表达式的最小值。
random(*)
返回随机数。
round(X[,Y])
返回数字表达式并四舍五入为指定的长度或精度。
字符处理函数
length(X)
返回给定字符串表达式的字符个数。
lower(X)
将大写字符数据转换为小写字符数据后返回字符表达式。
upper(X)
返回将小写字符数据转换为大写的字符表达式。
substr(X,Y,Z)
返回表达式的一部分。
randstr()
quote(A)
like(A,B)
确定给定的字符串是否与指定的模式匹配。
glob(A,B)
条件判断函数
coalesce(X,Y[,...])
ifnull(X,Y)
nullif(X,Y)
集合函数
avg(X)
返回组中值的平均值。
count(X)
返回组中项目的数量。
max(X)
返回组中值的最大值。
min(X)
返回组中值的最小值。
sum(X)
返回表达式中所有值的和。
其他函数
typeof(X)
返回数据的类型。
last_insert_rowid()
返回最后插入的数据的ID。
sqlite_version(*)
返回SQLite的版本。
change_count()
返回受上一语句影响的行数。
last_statement_change_count()
oh,还有就是看到有人说,好像成批插入的时候,启动事务,比不启动事务快n倍
还有就是尽量使用参数化的SQL,估计和商用DB一样能够自动Prepare.
===========
sqlite可以在shell/doscommand底下直接执行命令:
sqlite3film.db"select*fromfilm;"
输出HTML表格:
sqlite3-htmlfilm.db"select*fromfilm;"
将数据库「倒出来」:
sqlite3film.db".dump">output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):
sqlite3film.db 在大量插入资料时,你可能会需要先打这个指令:
begin;
插入完资料后要记得打这个指令,资料才会写进数据库中:
commit;
SQLITE深入------常见问题
如何建立自动增长字段?
简短回答:声明为INTEGERPRIMARYKEY的列将
会自动增长。
长一点的答案:如果你声明表的一列为INTEGERPRIMARYKEY,那么,每当你在该列上插入一NULL值时,NULL自动被转换为一个比该列中最大值大1的一个整数,如果表是空的,将会是1。(如果是最大可能的主键9223372036854775807,那个,将键值将是随机未使用的数。)如,有下列表:
CREATETABLEt1(
aINTEGERPRIMARYKEY,
bINTEGER
);
在该表上,下列语句
INSERTINTOt1VALUES(NULL,123);
在逻辑上等价于:
INSERTINTOt1VALUES((SELECTmax(a)FROMt1)+1,123);
有一个新的API叫做sqlite3_last_insert_rowid(),它将返回最近插入的整数值。注意该整数会比表中该列上的插入之前的最大值大1。该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在INTEGERPRIMARYKEY上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。如果最大可能的整数值在数据表中曾经存在过,INSERT将会失败,并返回SQLITE_FULL错误代码。
多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗?
多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT操作,但在任一时刻,只能有一个进程对数据库进行更改。
SQLite使用读、写锁控制对数据库的访问。(在Win95/98/ME等不支持读、写锁的系统下,使用一个概率性的模拟来代替。)但使用时要注意:如果数据库文件存放于一个NFS文件系统上,这种锁机制可能不能正常工作。这是因为fcntl()文件锁在很多NFS上没有正确的实现。在可能有多个进程同时访问数据库的时候,应该避免将数据库文件放到NFS上。在Windows上,Microsoft的文档中说:如果使用FAT文件系统而没有运行share.exe守护进程,那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我:对于网络文件,文件锁的实现有好多Bug,是靠不住的。如果他们说的是对的,那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。
我们意识到,没有其它嵌入式的SQL数据库引擎能象SQLite这样处理如此多的并发。SQLite允许多个进程同时打开一个数据库,同时读一个数据库。当有任何进程想要写时,它必须在更新过程中锁住数据库文件。但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地,其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。
但是,Client/Server数据库引擎(如PostgreSQL,MySQL,或Oracle)通常支持更高级别的并发,并且允许多个进程同时写同一个数据库。这种机制在Client/Server结构的数据库上是可能的
,因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。如果你的应用程序需要很多的并发,那么你应该考虑使用一个Client/Server结构的数据库。但经验表明,很多应用程序需要的并发,往往比其设计者所想象的少得多。
当SQLite试图访问一个被其它进程锁住的文件时,缺省的行为是返回SQLITE_BUSY。可以在C代码中使用sqlite3_busy_handler()或sqlite3_busy_timeout()API函数调整这一行为。
在SQLite数据库中如何列出所有的表和索引?
如果你运行sqlite3命令行来访问你的数据库,可以键入“.tables”来获得所有表的列表。或者,你可以输入“.schema”来看整个数据库模式,包括所有的表的索引。输入这些命令,后面跟一个LIKE模式匹配可以限制显示的表。
在一个C/C++程序中(或者脚本语言使用Tcl/Ruby/Perl/Python等)你可以在一个特殊的名叫SQLITE_MASTER上执行一个SELECT查询以获得所有表的索引。每一个SQLite数据库都有一个叫SQLITE_MASTER的表,它定义数据库的模式。SQLITE_MASTER表看起来如下:
CREATETABLEsqlite_master(
typeTEXT,
nameTEXT,
tbl_nameTEXT,
rootpageINTEGER,
sqlTEXT
);
对于表来说,type字段永远是'table',name字段永远是表的名字。所以,要获得数据库中所有表的列表,使用下列SELECT语句:
SELECTnameFROMsqlite_master
WHEREtype='table'
ORDERBYname;
对于索引,type等于'index',name则是索引的名字,tbl_name是该索引所属的表的名字。不管是表还是索引,sql字段是原先用CREATETABLE或CREATEINDEX语句创建它们时的命令文本。对于自动创建的索引(用来实现PRIMARYKEY或UNIQUE约束),sql字段为NULL。
SQLITE_MASTER表是只读的。不能对它使用UPDATE、INSERT或DELETE。它会被CREATETABLE、CREATEINDEX、DROPTABLE和DROPINDEX命令自动更新。
临时表不会出现在SQLITE_MASTER表中。临时表及其索引和触发器存放在另外一个叫SQLITE_TEMP_MASTER的表中。SQLITE_TEMP_MASTER跟SQLITE_MASTER差不多,但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表,不管是永久的还是临时的,可以使用类似下面的命令:
SELECTnameFROM
(SELECT*FROMsqlite_masterUNIONALL
SELECT*FROMsqlite_temp_master)
WHEREtype='table'
ORDERBYname
在SQLite中,VARCHAR字段最长是多少?
SQLite不强制VARCHAR的长度。你可以在SQLITE中声明一个VARCHAR(10),SQLite还是可以很高兴地允许你放入500个字符。并且这500个字符是原封不动的,它永远不会被截断。
SQLite支持二进制大对象吗?
SQLite3.0及以后版本允许你在任何列中存储BLOB数据。即使该列被声明为其它类型也可以。
在SQLite
中,如何在一个表上添加或删除一列?
SQLite有有限地ALTERTABLE支持。你可以使用它来在表的末尾增加一列,可更改表的名称。如果需要对表结构做更复杂的改变,则必须重新建表。重建时可以先将已存在的数据放到一个临时表中,删除原表,创建新表,然后将数据从临时表中复制回来。
如,假设有一个t1表,其中有"a","b","c"三列,如果要删除列c,以下过程描述如何做:
BEGINTRANSACTION;
CREATETEMPORARYTABLEt1_backup(a,b);
INSERTINTOt1_backupSELECTa,bFROMt1;
DROPTABLEt1;
CREATETABLEt1(a,b);
INSERTINTOt1SELECTa,bFROMt1_backup;
DROPTABLEt1_backup;
COMMIT;
在数据库中删除了很多数据,但数据库文件没有变小,是Bug吗?
不是。当你从SQLite数据库中删除数据时,未用的磁盘空间将会加入一个内部的“自由列表”中。当你下次插入数据时,这部分空间可以重用。磁盘空间不会丢失,但也不会返还给操作系统。
如果删除了大量数据,而又想缩小数据库文件占用的空间,执行VACUUM命令。VACUUM将会从头重新组织数据库。这将会使用数据库有一个空的“自由链表”,数据库文件也会最小。但要注意的是,VACUUM的执行会需要一些时间(在SQLite开发时,在Linux上,大约每M字节需要半秒种),并且,执行过程中需要原数据库文件至多两倍的临时磁盘空间。
对于SQLite3.1版本,一个auto-vacumm模式可以替代VACUUM命令。可以使用auto_vacuumpragma打开。
SQLITE_SCHEMAerror是什么错误?为什么会出现该错误?
当一个准备好的(prepared)SQL语句不再有效或者无法执行时,将返回一个SQLITE_SCHEMA错误。发生该错误时,SQL语句必须使用sqlite3_prepare()API来重新编译.在SQLite3中,一个SQLITE_SCHEMA错误只会发生在用sqlite3_prepare()/sqlite3_step()/sqlite3_finalize()API执行SQL时。而不会发生在使用sqlite3_exec()时。在版本2中不是这样。
准备好的语句失效的最通常原因是:在语句准备好后,数据库的模式又被修改了。另外的原因会发生在:
数据库离线:DETACHed.
数据库被VACUUMed
一个用户存储过程定义被删除或改变。
一个collation序列定义被删除或改变。
认证函数被改变。
在所有情况下,解决方法是重新编译并执行该SQL语句。因为一个已准备好的语句可以由于其它进程改变数据库模式而失效,所有使用sqlite3_prepare()/sqlite3_step()/sqlite3_finalize()API的代码都应准备处理SQLITE_SCHEMA错误。下面给出一个例子:
intrc;
sqlite3_stmt*pStmt;
charzSql[]="SELECT.....";
do{
/*CompilethestatementfromSQL.Assumesuccess.*/
sqlite3_prepare(pDb,zSql,-1,&;pStmt,0);
while(SQLITE_ROW==sqlite3_step(pStmt)){
/*Dosomethingwiththerowofavailabledata*/
}
/*Finalizethestatement.IfanSQLITE_SCHEMAerrorhas
**occured,thentheabovecalltosqlite3_step()willhave
**returnedSQLITE_ERROR.sqlite3_finalize()willreturn
**SQLITE_SCHEMA.Inthiscasetheloopwillexecuteagain.
*/
rc=sqlite3_finalize(pStmt);
}while(rc==SQLITE_SCHEMA);
如何在字符串中使用单引号(')?
SQL标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号。在这方面SQL用起来类似Pascal语言。SQLite尊循标准。如:
INSERTINTOxyzVALUES('5O''clock');
Sqlite中如何返回本地化当前时间?
在做ClinicOS的时候遇到一个问题,在保存病历登记时间时,我使用了“CURRENT_TIMESTAMP”,但这有个问题,它返回的是UTCTime,这对我们中国人没啥用,一直希望能想办法将它转为localtime。今天刚好有空,所以去查了查Sqlite的MailList,果然也有人遇到了这个问题,我从一篇名为《translatetimecomparisonstatement》(mail-archive/sqlite-users@sqlite.org/msg12350.html)中看到这样的回复:
二十.如何更新表中数据
updatecontactsetlastname=’江南七怪’whereid=1028
updatecontactsetlastname='江南七怪',mobile='13912345678'whereid=1028;
二十一.如何一次插入多个数据
InsertintoSAMPLE(PRJNUM,PRJNAME,EMYNUM,EMYNAME,SALCATEGORY,SALPACKAGE)values(100001,'TPMS',200001,'Johnson','A',2000),(100001,'TPMS',200002,'Christine','B',3000),(100001,'TPMS',200003,'Kevin','C',4000),(100002,'TCT',200001,'Johnson','A',2000),(100002,'TCT',200004,'Apple','B',3000);2010年SQLite学习笔记之三
一.如何备份数据库
先打开数据库test.db
E:\sqlite\tool\sqlite-3_6_22>sqlite3D:\Test\debug\test.db
sqlite>.backupD:\\Test\\debug\\test.bak
注意:一定要用\\双斜杠
二.如何恢复数据库
先打开数据库test.db
E:\sqlite\tool\sqlite-3_6_22>sqlite3D:\Test\debug\test.db
sqlite>.restoreD:\\Test\\debug\\test.bak
注意:一定要用\\双斜杠
三.先判断表如果不存在,则再创建表
SQL可以如下写,供参考:
createtableifnotexistsstudent(idintegerprimarykeyautoincrement,\
agesmallint,anchorsmallint);
四.如何查询SQLite3小工具或者SQLite3.dll动态链接库的版本
执行selectsqlite_version();命令即可
五.SQLite3的最新版本是(截止日期2010年2月22日)
3.6.22
六.针对SQLite3,两大优秀C++封装库
1.CppSQLite3
codeproject/KB/database/CppSQLite.aspx
2.wxSQLite3
sourceforge.net/projects/wxcode/files/Components/wxSQLite3/wxsqlite3-1.9.8.zip/download
七.如何在Windows下编译SQLite3
1.先从官网获取sq
lite-amalgamation-3_6_22.zip;
2.接着从官网获取sqlitedll-3_6_22.zip
下载编译好的DLL,这里有我们需要的sqlite3.def该文件
3.打开VC新建一个“Win32Dynamic-LinkLibrary”工程,命名为:sqlite3;
4.在接下来的对话框中选择"AnemptyDLLproject",点FINISH->OK;
5.将sqlite-amalgamation-3_6_22文件夹下的sqlite3.h以及sqlite3.c两个文件复制到工程文件夹下;
将sqlitedll-3_6_22文件夹下的sqlite3.def该文件复制到工程文件夹下;
6.在工程的SourceFiles中添加sqlite3.c文件;
7.在工程的IncludeFiles中添加sqlite3.h文件;
8.在工程的ResourceFiles中添加sqlite3.def文件;
9.针对如下问题:
sqlite3.def:errorLNK2001:unresolvedexternalsymbolsqlite3_column_database_name
sqlite3.def:errorLNK2001:unresolvedexternalsymbolsqlite3_column_database_name16
sqlite3.def:errorLNK2001:unresolvedexternalsymbolsqlite3_column_origin_name
sqlite3.def:errorLNK2001:unresolvedexternalsymbolsqlite3_column_origin_name16
sqlite3.def:errorLNK2001:unresolvedexternalsymbolsqlite3_column_table_name
sqlite3.def:errorLNK2001:unresolvedexternalsymbolsqlite3_column_table_name16
sqlite3.def:errorLNK2001:unresolvedexternalsymbolsqlite3_table_column_metadata
Debug/sqlite3.lib:fatalerrorLNK1120:7unresolvedexternals
在菜单【Project】-【Settings…】-【C/C++】标签下的Category【General】下
Preprocessordefinitions下:
新增2个编译选项,分别是:
THREADSAFE
SQLITE_ENABLE_COLUMN_METADATA
10.往工程中添加sqlite3.def文件就是为生成sqlite3.lib文件;
sqlite3.lib是与sqlite3.dll动态链接库文件一起提供给软件开发者的;
八.如何解决Windows下的编译警告
e:\sqlite\code\sqlite3\sqlite3.c(15385):warningC4047:'function':'void**'differsinlevelsofindirectionfrom'long*'
e:\sqlite\code\sqlite3\sqlite3.c(15385):warningC4022:'InterlockedCompareExchange':pointermismatchforactualparameter1
e:\sqlite\code\sqlite3\sqlite3.c(15385):warningC4022:'InterlockedCompareExchange':pointermismatchforactualparameter2
e:\sqlite\code\sqlite3\sqlite3.c(15403):warningC4047:'function':'void**'differsinlevelsofindirectionfrom'long*'
e:\sqlite\code\sqlite3\sqlite3.c(15403):warningC4022:'InterlockedCompareExchange':pointermismatchforactualparameter1
e:\sqlite\code\sqlite3\sqlite3.c(15403):warningC4022:'InterlockedCompareExchange':pointermismatchforactualparameter3
e:\sqlite\code\sqlite3\sqlite3.c(15403):warningC4047:'==':'void*'differsinlevelsofindirectionfrom'constint'
e:\sqlite\code\sqlite3\sqlite3.c(65536):warningC4049:compilerlimit:terminatinglinenumberemission
warningC4761:integralsizemismatchinargument;conversionsupplied
warningC4761:integ
ralsizemismatchinargument;conversionsupplied
warningC4761:integralsizemismatchinargument;conversionsupplied
目前,还不想直接屏蔽警告错误。没有想到更好的方法。待定。
有知道的朋友,还请指点。我将不甚感激。