sqlite3使用简介
Windows中SQLite3使用–-配置 一、SQLite3简介 SQLite3是一个开源免费的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它不像大型数据库管理系统,占用系统大量资源。SQLite3是用C语言编写的开源数据库,可移植性好,容易使用、轻型、高效、可靠,主要用在嵌入式系统中,由于其便利性,目前很多桌面程序也使用了SQLite3,如:360杀毒,金山毒霸等。SQLite3基本支持SQL92标准。如:索引、限制、触发和查看支持。支持NULL、INTEGER、REAL、TEXT、BLOB数据类型,支持事物。
二、使用版本 本文使用的SQLite3版本为:3.6.23.1 下载地址:http://www.sqlite.org/download.html 在使用中,一般下载两个压缩包即可:sqlite-amalgamation-3_6_23_1.zip、sqlitedll-3_6_23_1.zip 三、配置 在Windows中,使用第三方库有很多种方式,大多数软件使用动态dll、使用静态导入库、使用静态链接库。由于下载的压缩包中,本来就有sqlite3.dll文件,使用起来也十分方便,所以本文主要讲解后面两种方式的配置。 1、使用静态导入库 静态导入库也称为输入库,是目标库文件的一种特殊形式。像目标库一样,输入库有.lib扩展名,并且被链接程序用来确定源程序代码中的函数调用。导入库不含代码,而是为连接程序提供信息,以便在.exe文件中建立动态链接时要用到的重定位表。 在下载的压缩包中,没有导入库,所以我们需要自己编译,编译过程如下: 1、将压缩包sqlitedll-3_6_23_1.zip解压到一个目录。 2、拷贝VS2005中lib.exe、link.exe、mspdb80.dll到刚才解压的目录。VS2005中文件的路径为:C:/Program Files/Microsoft Visual Studio 8/VC/bin、C:/Program Files/Microsoft Visual Studio 8/VC/bin 3、打开CMD窗口,切换到对应的目录,输入:LIB /DEF:sqlite3.def /machine:IX86 编译之后,便会在本地目录中产生sqlite3.lib导入库文件,将此库链接入程序,另一个压缩包中有sqlite3.h头文件,这两个文件配合使用,如果本地有sqlite3.dll,便可以通过静态导入库来使用SQLite3了。 2、使用静态链接库 静态链接库也称为目标库,是带.lib扩展名的文件。在用链接程序进行静态链接时,它的代码就会加到程序的.exe文件中。 下载的安装包中,也不存在静态链接库,所以我们也需要自己编译,编译过程如下: 1、用VS2005建立一个名为sqlite3的静态链接库工程。 2、将压缩包中的文件sqlite3.c、sqlite3.h添加入工程,将输出文件名改为sqlite3.lib,编译。 编译之后,便会在设置的目录中产生sqlite3.lib静态链接库,通过本lib文件与sqlite3.h文件,便可以使用SQLite3了,此处可以看到,使用时并不需要sqlite3.dll文件。 注:VS2005默认的编译模式为“/MD”,如果要完全不依赖于其他dll,可以设置为“/MT”。 四、查看数据库 SQLite官网有查看的工具,使用后感觉不方便,也不友好。在此推荐一个工具SQLiteSpy,提供图形界面方式查看SQLite3数据库,操作方式十分简单,只要见SQLite数据库文件直接打开即可,想必您一定会用。 下载地址:http://www.yunqa.de/delphi/sqlitespy/ 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完成配置可以使用sqlite了。 使用的过程根据使用的函数大致分为如下几个过程:
这几个过程是概念上的说法,而不完全是程序运行的过程,如sqlite3_column()表示的是对查询获得一行里面的数据的列的各个操作统称,实际上在sqlite中并不存在这个函数。 1.sqlite3_open():打开数据库 在操作数据库之前,首先要打开数据库。这个函数打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。这个操作同时程序中的第一个调用的sqlite函数,同时也是其他sqlite api的先决条件。许多的sqlite接口函数都需要一个数据库连接对象的指针作为它们的第一个参数。 函数定义 int sqlite3_open( const char *filename,/* Database filename (UTF-8) */ sqlite3 **ppDb/* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename,/* Database filename (UTF-16) */ sqlite3 **ppDb/* OUT: SQLite db handle */ ); int sqlite3_open_v2( const char *filename,/* Database filename (UTF-8) */ sqlite3 **ppDb,/* OUT: SQLite db handle */ int flags,/* Flags */ const char *zVfs/* Name of VFS module to use */ );
说明: 假如这个要被打开的数据文件不存在,则一个同名的数据库文件将被创建。如果使用sqlite3_open和sqlite3_open_v2的话,数据库将采用UTF-8的编码方式,sqlite3_open16采用UTF-16的编码方式 返回值: 如果sqlite数据库被成功打开(或创建),将会返回SQLITE_OK,否则将会返回错误码。Sqlite3_errmsg()或者sqlite3_errmsg16可以用于获得数据库打开错误码的英文描述,这两个函数定义为: const char *sqlite3_errmsg(sqlite3*); const void *sqlite3_errmsg16(sqlite3*);
参数说明: filename:需要被打开的数据库文件的文件名,在sqlite3_open和sqlite3_open_v2中这个参数采用UTF-8编码,而在sqlite3_open16中则采用UTF-16编码 ppDb:一个数据库连接句柄被返回到这个参数,即使发生错误。唯一的一场是如果sqlite不能分配内存来存放sqlite对象,ppDb将会被返回一个NULL值。 flags:作为数据库连接的额外控制的参数,可以是SQLITE_OPEN_READONLY,SQLITE_OPEN_READWRITE和SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一个,用于控制数据库的打开方式,可以和SQLITE_OPEN_NOMUTEX,SQLITE_OPEN_FULLMUTEX,SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE结合使用,具体的详细情况可以查阅文档 2.Sqlite3_prepare() 这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句 函数定义(仅列出UTF-8的) int sqlite3_prepare( sqlite3 *db,/* Database handle */ const char *zSql,/* SQL statement,UTF-8 encoded */ int nByte,/* Maximum length of zSql in bytes. */ sqlite3_stmt **ppStmt,/* OUT: Statement handle */ const char **pzTail/* OUT: Pointer to unused portion of zSql */ ); int sqlite3_prepare_v2( sqlite3 *db,/* OUT: Statement handle */ const char **pzTail/* OUT: Pointer to unused portion of zSql */ );
参数: db:数据指针 zSql:sql语句,使用UTF-8编码 nByte:如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止 pzTail:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符 ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,如假如输入的文本不包括sql语句。调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它。
说明 如果执行成功,则返回SQLITE_OK,否则返回一个错误码。推荐在现在任何的程序中都使用sqlite3_prepare_v2这个函数,sqlite3_prepare只是用于前向兼容 备注 <1>准备语句(prepared statement)对象 typedef struct sqlite3_stmt sqlite3_stmt;
准备语句(prepared statement)对象一个代表一个简单SQL语句对象的实例,这个对象通常被称为“准备语句”或者“编译好的SQL语句”或者就直接称为“语句”。 语句对象的生命周期经历这样的过程: l使用sqlite3_prepare_v2或相关的函数创建这个对象 l使用sqlite3_bind_*()给宿主参数(host parameters)绑定值 l通过调用sqlite3_step一次或多次来执行这个sql l使用sqlite3——reset()重置这个语句,然后回到第2步,这个过程做0次或多次 l使用sqlite3_finalize()销毁这个对象
在sqlite中并没有定义sqlite3_stmt这个结构的具体内容,它只是一个抽象类型,在使用过程中一般以它的指针进行操作,而sqlite3_stmt类型的指针在实际上是一个指向Vdbe的结构体得指针 <2>宿主参数(host parameters) 在传给sqlite3_prepare_v2()的sql的语句文本或者它的变量中,满足如下模板的文字将被替换成一个参数: l? l?NNN,NNN代表数字 l:VVV,VVV代表字符 l@VVV l$VVV 在上面这些模板中,NNN代表一个数字,VVV代表一个字母数字标记符(例如:222表示名称为222的标记符),sql语句中的参数(变量)通过上面的几个模板来指定,如 “select ? from ? “这个语句中指定了两个参数,sqlite语句中的第一个参数的索引值是1,这就知道这个语句中的两个参数的索引分别为1和2,使用”?”的话会被自动给予索引值,而使用”?NNN”则可以自己指定参数的索引值,它表示这个参数的索引值为NNN。”:VVV”表示一个名为”VVV”的参数,它也有一个索引值,被自动指定。 可以使用sqlite3_bind_*()来给这些参数绑定值
3.sqlite3_setp() 这个过程用于执行有前面sqlite3_prepare创建的准备语句。这个语句执行到结果的第一行可用的位置。继续前进到结果的第二行的话,只需再次调用sqlite3_setp()。继续调用sqlite3_setp()知道这个语句完成,那些不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回 函数定义 int sqlite3_step(sqlite3_stmt*); 返回值 函数的返回值基于创建sqlite3_stmt参数所使用的函数,假如是使用老版本的接口sqlite3_prepare()和sqlite3_prepare16(),返回值会是SQLITE_BUSY,SQLITE_DONE,SQLITE_ROW,SQLITE_ERROR或SQLITE_MISUSE,而v2版本的接口sqlite3_prepare_v2()和sqlite3_prepare16_v2()则会同时返回这些结果码和扩展结果码。 对所有V3.6.23.1以及其前面的所有版本,需要在sqlite3_step()之后调用sqlite3_reset(),在后续的sqlite3_ step之前。如果调用sqlite3_reset重置准备语句失败,将会导致sqlite3_ step返回SQLITE_MISUSE,但是在V3. 6.23.1以后,sqlite3_step()将会自动调用sqlite3_reset。 int sqlite3_reset(sqlite3_stmt *pStmt); sqlite3_reset用于重置一个准备语句对象到它的初始状态,然后准备被重新执行。所有sql语句变量使用sqlite3_bind*绑定值,使用sqlite3_clear_bindings重设这些绑定。Sqlite3_reset接口重置准备语句到它代码开始的时候。sqlite3_reset并不改变在准备语句上的任何绑定值,那么这里猜测,可能是语句在被执行的过程中发生了其他的改变,然后这个语句将它重置到绑定值的时候的那个状态。
4.sqlite3_column() 这个过程从执行sqlite3_step()执行一个准备语句得到的结果集的当前行中返回一个列。每次sqlite3_step得到一个结果集的列停下后,这个过程就可以被多次调用去查询这个行的各列的值。对列操作是有多个函数,均以sqlite3_column为前缀 const void *sqlite3_column_blob(sqlite3_stmt*,int iCol); int sqlite3_column_bytes(sqlite3_stmt*,int iCol); int sqlite3_column_bytes16(sqlite3_stmt*,int iCol); double sqlite3_column_double(sqlite3_stmt*,int iCol); int sqlite3_column_int(sqlite3_stmt*,int iCol); sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*,int iCol); const unsigned char *sqlite3_column_text(sqlite3_stmt*,int iCol); const void *sqlite3_column_text16(sqlite3_stmt*,int iCol); int sqlite3_column_type(sqlite3_stmt*,int iCol); sqlite3_value *sqlite3_column_value(sqlite3_stmt*,int iCol); 说明 第一个参数为从sqlite3_prepare返回来的prepared statement对象的指针,第二参数指定这一行中的想要被返回的列的索引。最左边的一列的索引号是0,行的列数可以使用sqlite3_colum_count()获得。 这些过程会根据情况去转换数值的类型,sqlite内部使用sqlite3_snprintf()去自动进行这个转换,下面是关于转换的细节表: |