SQLite3 API使用大全

合集下载

Python之Sqlite3数据库基本操作

Python之Sqlite3数据库基本操作

Python之Sqlite3数据库基本操作在⼀些⼩的应⽤中,难免会⽤到数据库,Sqlite数据库以其⼩巧轻便,⽆需安装,移植性好著称,本⽂主要以⼀个简单的⼩例⼦,简述Python在Sqlite数据库⽅⾯的应⽤,仅供学习分享使⽤,如有不⾜之处,还请指正。

涉及知识点1. sqlite3是Python集成的内置类库,提供Python操作sqlite3的相关接⼝。

2. sqlite3.connect(dbfile) 创建数据库连接,返回⼀个连接对象3. conn.cursor() 创建游标对象,通过返回的cursor对象,执⾏相应的SQL语句。

4. cur.execute(sql, *args) 执⾏语句5. mit() 提交执⾏的结果到数据库6. conn.rollback() 回退执⾏的结果7. cur.close() 关闭cursor对象8. conn.close() 关闭连接对象基础操作代码关于Python操作sqlite3的相关核⼼代码,如下所⽰:创建数据表1def createDb():2"""创建db数据表"""3 sql = '''4 create table person (5 id integer primary key autoincrement not null,6 name varchar not null,7 age integer8 )9'''10 executeSql(sql)View Code插⼊语句1def insertData(name, age):2"""插⼊数据"""3 sql = 'insert into person (name,age)values(?,?)'4 executeSql(sql, (name, age))View Codeupdate语句1def updateData(id, name, age):2"""通过ID进⾏修改语句"""3 sql = 'update person set name=?,age =? where id=?'4 executeSql(sql, (name, age, id))View Codedelete语句1def deleteData(id):2"""通过ID删除数据"""3 sql = 'delete from person where id=?'4 executeSql(sql, (id,))View Code上⾯的语句都调⽤统⼀的executeSql⽅法,如下所⽰:1def executeSql(sql, *args):2"""执⾏更新语句"""3 conn = sqlite3.connect(dbfile)4 cur = conn.cursor()5try:6 cur.execute(sql, *args)7 mit()8print('执⾏成功,影响⾏数:', cur.rowcount)9except Exception as e:10 conn.rollback()11print(e)12print('执⾏失败')13finally:14 cur.close()15 conn.close()View Code查询语句(⽆条件查询)1def queryData():2"""查询语句"""3 sql = 'select id,name,age from person '4 executeQuerySql(sql)View Code查询语句(条件查询)1def queryDataById(id):2"""通过id进⾏查询"""3 sql = 'select id,name,age from person where id = ? '4 executeQuerySql(sql, (id,))View Code上⾯的查询语句,都调⽤统⼀的executeQuerySql⽅法,如下所⽰:1def executeQuerySql(sql, *args):2"""执⾏查询语句,可带参数"""3 conn = sqlite3.connect(dbfile)4 cur = conn.cursor()5try:6 cur.execute(sql, *args)7 persons = cur.fetchall()8for p in persons:9print('当前⾏信息如下:')10print(p) # 返回的是⼀个元组tuple11print('查询成功')12except Exception as e:13print(e)14print('查询失败')15finally:16 cur.close()17 conn.close()View Code关于本例⼦的执⾏源码,可通过链接进⾏下载,如下所⽰:Python参数传递⽅式Python的参数传递⼀共有以下五种(位置参数、默认参数、变长参数、关键字参数、命名关键字参数)位置传递,即参数按照定义的位置及顺序进⾏传递,如下所⽰:1# 位置传递实例:2def fun1(a, b, c):3return a + b + c456print(fun1(1, 2, 3))View Code关键字传递,即通过传递的参数的名称进⾏识别。

sqlite3的基本使用以及封装使用

sqlite3的基本使用以及封装使用

sqlite3的基本使⽤以及封装使⽤1基本使⽤1.打开数据库int sqlite3_open(const char *filename, // 数据库的⽂件路径sqlite3 **ppDb // 数据库实例);2.执⾏任何SQL语句int sqlite3_exec(sqlite3*, // ⼀个打开的数据库实例const char *sql, // 需要执⾏的SQL语句int (*callback)(void*,int,char**,char**), // SQL语句执⾏完毕后的回调void *, // 回调函数的第1个参数char **errmsg // 错误信息);3.检查SQL语句的合法性(查询前的准备)int sqlite3_prepare_v2(sqlite3 *db, // 数据库实例const char *zSql, // 需要检查的SQL语句int nByte, // SQL语句的最⼤字节长度sqlite3_stmt **ppStmt, // sqlite3_stmt实例,⽤来获得数据库数据const char **pzTail);4.查询⼀⾏数据int sqlite3_step(sqlite3_stmt*); // 如果查询到⼀⾏数据,就会返回SQLITE_ROW5.利⽤stmt获得某⼀字段的值(字段的下标从0开始)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 void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // ⼆进制⽂本数据const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据1创建⼀个model类,.h⽂件#import <Foundation/Foundation.h>@interface IWStudent : NSObject@property (nonatomic, assign) int ID;@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) int age;@end.m⽂件#import"IWStudent.h"@implementation IWStudent@end2创建⼯具类....封装⽅法.h⽂件#import <Foundation/Foundation.h>@class IWStudent;@interface IWStudentTool : NSObject/*** 添加学⽣** @param student 需要添加的学⽣*/+ (BOOL)addStudent:(IWStudent *)student;/*** 获得所有的学⽣** @return 数组中装着都是IWStudent模型*/+ (NSArray *)students;/*** 根据搜索条件获得对应的学⽣** @param condition 搜索条件*/+ (NSArray *)studentsWithCondition:(NSString *)condition;@end.m⽂件#import"IWStudentTool.h"#import"IWStudent.h"#import <sqlite3.h>@implementation IWStudentTool// static的作⽤:能保证_db这个变量只被IWStudentTool.m直接访问static sqlite3 *_db;+ (void)initialize{// 0.获得沙盒中的数据库⽂件名NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"]; // 1.创建(打开)数据库(如果数据库⽂件不存在,会⾃动创建)int result = sqlite3_open(filename.UTF8String, &_db);if (result == SQLITE_OK) {NSLog(@"成功打开数据库");// 2.创表const char *sql = "create table if not exists t_student (id integer primary key autoincrement, name text, age integer);";char *errorMesg = NULL;int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMesg);if (result == SQLITE_OK) {NSLog(@"成功创建t_student表");} else {NSLog(@"创建t_student表失败:%s", errorMesg);}} else {NSLog(@"打开数据库失败");}}+ (BOOL)addStudent:(IWStudent *)student{NSString *sql = [NSString stringWithFormat:@"insert into t_student (name, age) values('%@', %d);", , student.age];char *errorMesg = NULL;int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);return result == SQLITE_OK;}+ (NSArray *)students{// 0.定义数组NSMutableArray *students = nil;// 1.定义sql语句const char *sql = "select id, name, age from t_student;";// 2.定义⼀个stmt存放结果集sqlite3_stmt *stmt = NULL;// 3.检测SQL语句的合法性int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"查询语句是合法的");students = [NSMutableArray array];// 4.执⾏SQL语句,从结果集中取出数据while (sqlite3_step(stmt) == SQLITE_ROW) { // 真的查询到⼀⾏数据// 获得这⾏对应的数据IWStudent *student = [[IWStudent alloc] init];// 获得第0列的idstudent.ID = sqlite3_column_int(stmt, 0);// 获得第1列的nameconst unsigned char *sname = sqlite3_column_text(stmt, 1); = [NSString stringWithUTF8String:(const char *)sname];// 获得第2列的agestudent.age = sqlite3_column_int(stmt, 2);// 添加到数组[students addObject:student];}} else {NSLog(@"查询语句⾮合法");}return students;}+ (NSArray *)studentsWithCondition:(NSString *)condition{// 0.定义数组NSMutableArray *students = nil;// 1.定义sql语句const char *sql = "select id, name, age from t_student where name like ?;";// 2.定义⼀个stmt存放结果集sqlite3_stmt *stmt = NULL;// 3.检测SQL语句的合法性int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);if (result == SQLITE_OK) {NSLog(@"查询语句是合法的");students = [NSMutableArray array];// 填补占位符的内容NSString *newCondition = [NSString stringWithFormat:@"%%%@%%", condition]; // NSLog(@"%@", newCondition);sqlite3_bind_text(stmt, 1, newCondition.UTF8String, -1, NULL);// 4.执⾏SQL语句,从结果集中取出数据while (sqlite3_step(stmt) == SQLITE_ROW) { // 真的查询到⼀⾏数据// 获得这⾏对应的数据IWStudent *student = [[IWStudent alloc] init];// 获得第0列的idstudent.ID = sqlite3_column_int(stmt, 0);// 获得第1列的nameconst unsigned char *sname = sqlite3_column_text(stmt, 1); = [NSString stringWithUTF8String:(const char *)sname];// 获得第2列的agestudent.age = sqlite3_column_int(stmt, 2);// 添加到数组[students addObject:student];}} else {NSLog(@"查询语句⾮合法");}return students;}@end2.封装为⼯具类。

SQLiteAPI接口学习总结

SQLiteAPI接口学习总结

SQLiteAPI接口学习总结库初始化int sqlite3_initialize(void);int sqlite3_shutdown(void);在使用SQlite Library之前,首先应该调用sqlite3_initialize函数,该函数将分配资源,初始化一些必要的数据结构。

与之配合使用的另一个函数是sqlite3_shutdown,该函数用来释放由sqlite3_initialize分配的资源。

不过在很多客户的应用程序中通常直接调用sqlite3_open 或者另一些主要的API函数,这些函数会自动初始化SQlite library(如果它还没有被初始化的话)。

不过还是推荐客户应用程序显示调用这两个APIs函数来完成SQlite library的初始化和最后的清理工作。

打开数据库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 */);在执行任何SQL语句之前,必须首先连接到一个数据库,也就是打开或者新建一个SQlite3数据库文件。

数据库sqlite3的使用

数据库sqlite3的使用
1-- 安装数据库:
sudo dpkg -i *.deb
2-- 创建数据库
sqlite3 stu.db
3-- sqlite命令
系统命令 以 "."开头
普通命令 ,以";"结束
.schema 查看表的结构
功能:获取错误信息描述
(3)int sqlite3_close(sqlite3* db);
功能:关闭一个数据库
(4)int sqlite3_exec(
sqlite3* db, /* An open database */
5-- sqlite3 API 函数口
(1)int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:打开一个数据库
参数:filename 数据库名字
ppdb 操作数据库的指针,句柄。
返回值:成功 SQLITE_OK , 失败 error_code
(2)const char *sqlite3_errmsg(sqlite3* db);
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void * arg, /* 1st argument to callback */
char **errmsg /* Error msg written here */

sqlite3用法总结

sqlite3用法总结

SQLITE3使用总结2009-01-21 17:57作者:董淳光 dcg1981@2007年6月11日星期一前序:Sqlite3 的确很好用。

小巧、速度快。

但是因为非微软的产品,帮助文档总觉得不够。

这些天再次sqlite3 的研究列出来,以备忘记。

这里要注明,我是一个跨平台专注者,并不喜欢只用 windows 平台。

我以前的工作就是为 unix 然没有验证,但是我已尽量不使用任何 windows 的东西,只使用标准 C 或标准C++。

但是,我没编译,因此下面的叙述如果不正确,则留待以后修改。

下面我的代码仍然用 VC 编写,因为我觉得VC是一个很不错的IDE,可以加快代码编写速度(例如译环境,是VC2003。

如果读者觉得自己习惯于 unix 下用 vi 编写代码速度较快,可以不用管我因为我用的是标准 C 或 C++ 。

不会给任何人带来不便。

一、版本从网站可下载到最新的 sqlite 代码和编译版本。

我写此文章时,最新代码是很久没有去下载 sqlite 新代码,因此也不知道 sqlite 变化这么大。

以前很多文件,现在全部合独用此文件,是挺好的,省去拷贝一堆文件还担心有没有遗漏。

但是也带来一个问题:此文件太大机器都慢下来了。

如果不需要改它代码,也就不需要打开 sqlite3.c 文件,机器不会慢。

但是,成加密功能,那时候就比较痛苦了。

如果个人水平较高,建议用些简单的编辑器来编辑,例如 Ult二、基本编译这个不想多说了,在 VC 里新建 dos 控制台空白工程,把 sqlite3.c 和 sqlite3.h 添加到工程面写:extern "C"{#include "./sqlite3.h"};int main( int , char** ){return 0;}为什么要extern “C” ?如果问这个问题,我不想说太多,这是C++的基础。

要在 C++ 里使用一段括起来。

SQLite3和SQLite数据库的操作

SQLite3和SQLite数据库的操作

SQLite3和SQLite数据库的操作1.格式化sqlite3的显示:sqlite>.header onsqlite>.mode column (设置输出模式,column 左对齐的列;line 每行一个值)sqlite>.timer onsqlite>.width column1_width column2_width ... (为 "column" 模式设置列宽度。

)2.SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义3.sqlite语句要以分号";"结尾4.$sqlite3 DatabaseName.db 创建一个新的数据库5.sqlite>.databases 查看数据库列表6.$sqlite3 testDB.db .dump > testDB.sql (将整个 testDB.db 数据库的内容转换为SQLite 的语句,并将其转储到ASCII 文本文件testDB.sql 中)7.$sqlite3 testDB.db < testDB.sql (将sql文件中的SQLite语句还原成数据库)8.sqlite> ATTACH DATABASE 'DatabaseName' As 'Alias-Name';(数据库DatabaseName尚未被创建,上面的命令将创建一个数据库DatabaseName,并且数据库名为Alias-Name;如果数据库已存在,则把数据库文件名称与逻辑数据库 'Alias-Name' 绑定在一起。

) (数据库名称 main 和 temp 被保留用于主数据库和存储临时表及其他临时数据对象的数据库。

这两个数据库名称可用于每个数据库连接,且不应该被用于附加,否则将得到一个警告消息)9.sqlite> DETACH DATABASE 'Alias-Name'; 把命名数据库从一个数据库连接分离和游离出来,连接是之前使用ATTACH 语句附加的。

sqlite3的操作方法及应用

sqlite3的操作方法及应用

数据库的操作我们在这个项目中使用的是SQLITE3数据库软件。

通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中。

1.打开数据库,创建表1.1 sqlite * db; 定义一个sqlite * 的变量sqlite3_open(“./link.db”,&db);在当前目录下打开一个名为link.db的数据库,若是没有则在当前目录下创建一个名为link.db的数据库。

1.2 sql = "create table weblink(id integer primary key,domain text,page text,fromdomain text,status integer);"在已打开的数据库中创建一个名weblink的表。

表的属性如下:id integer primary key :ID号(表中黙认包含的)domain text :域名page text :子网页fromdomain text :源域名status integer :状态标志1.3 sqlite3_exec(db,sql,NULL,NULL,NULL);执行一条sql 语句的函数。

函数原型:int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg )第1个参数是前面open函数得到的指针。

说了是关键数据结构。

第2个参数const char *sql 是一条sql 语句,以\0结尾。

第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。

(什么是回调函数,自己找别的资料学习)第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。

sqlite3 api sqlite3_busy_timeout 与 sqlite3_busy_handler 的使用与区别

sqlite3 api sqlite3_busy_timeout 与 sqlite3_busy_handler 的使用与区别
在用多数据连接方式使用sqlite时,常常会遇到SQLITE_BUSY的错误,这是由于使用当前连接访问数据时,要申请相应级别的锁,而各个级别的锁有些是互斥的,当申请不到锁时就会返回这个错误。这时只要稍等片刻,等其它连接的操作处理完,释放了相斥的锁之后就可以取得锁并进行操作了。
但是sqlite3中并未对出现sqlite_busy后重试做默认的处理,而是提供了一种处理机制busy handle。有两个api可以创建busy handle。
回调函数返回非0,数据库会重试当前操作,返回0则当前操作返回SQLITE_BUSY
int sqlite3_busy_timeout(sqlite3*, int ms);
定义一个毫秒数,当未到达该毫秒数时,sqlite会sleep并重试当前操作
如果超过ms毫秒,仍然申请不到需要的锁,当前操作返回sqlite_BUSY
当ms<=0时,清除busy handle,申请不到锁直接返回
从上面可以得知,一个函数可以控制超时的次数,一个函数可以控制超时的时间
但对于一个连接来说,只能有一个busy handle,所以两个函数会相互影响,设置一个的同时会清除另一个,应根据需要来选择。
int sqlite3_busy_handler(sqlite3 *, int (*)(void *, int), void *)
函ห้องสมุดไป่ตู้可以定义一个回调函数,当出现数据库忙时,sqlite会调用该函数
当回调函数为NULL时,清除busy handle,申请不到锁直接返回
回调函数的第二个函数会被传递为该由此次忙事件调用该函数的次数
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SQLite3API使用大全E-mail:18918737 (at) qq dot com,智有不明前序: (1)一、版本 (1)二、基本编译 (2)三、 SQLITE操作入门 (2)(1)基本流程 (2)(2) SQL语句操作 (4)(3)操作二进制 (8)(4)事务处理 (10)四、给数据库加密 (10)五、后记 (25)前序:Sqlite3 的确很好用。

小巧、速度快。

但是因为非微软的产品,帮助文档总觉得不够。

这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记。

这里要注明,我是一个跨平台专注者,并不喜欢只用 windows 平台。

我以前的工作就是为unix 平台写代码。

下面我所写的东西,虽然没有验证,但是我已尽量不使用任何 windows 的东西,只使用标准 C 或标准C++。

但是,我没有尝试过在别的系统、别的编译器下编译,因此下面的叙述如果不正确,则留待以后修改。

下面我的代码仍然用 VC 编写,因为我觉得VC是一个很不错的IDE,可以加快代码编写速度(例如配合 Vassist )。

下面我所说的编译环境,是VC2003。

如果读者觉得自己习惯于 unix 下用 vi 编写代码速度较快,可以不用管我的说明,只需要符合自己习惯即可,因为我用的是标准 C 或 C++ 。

不会给任何人带来不便。

一、版本从网站可下载到最新的 sqlite 代码和编译版本。

我写此文章时,最新代码是 3.3.17 版本。

很久没有去下载 sqlite 新代码,因此也不知道 sqlite 变化这么大。

以前很多文件,现在全部合并成一个 sqlite3.c 文件。

如果单独用此文件,是挺好的,省去拷贝一堆文件还担心有没有遗漏。

但是也带来一个问题:此文件太大,快接近7万行代码,VC开它整个机器都慢下来了。

如果不需要改它代码,也就不需要打开 sqlite3.c 文件,机器不会慢。

但是,下面我要写通过修改 sqlite 代码完成加密功能,那时候就比较痛苦了。

如果个人水平较高,建议用些简单的编辑器来编辑,例如 UltraEdit 或 Notepad 。

速度会快很多。

二、基本编译这个不想多说了,在 VC 里新建 dos 控制台空白工程,把 sqlite3.c 和 sqlite3.h 添加到工程,再新建一个 main.cpp 文件。

在里面写:extern "C"{#include "./sqlite3.h"};int main( int , char** ){return 0;}为什么要extern “C” ?如果问这个问题,我不想说太多,这是C++的基础。

要在 C++ 里使用一段 C 的代码,必须要用extern “C” 括起来。

C++跟 C虽然语法上有重叠,但是它们是两个不同的东西,内存里的布局是完全不同的,在C++编译器里不用extern “C”括起C代码,会导致编译器不知道该如何为 C 代码描述内存布局。

可能在 sqlite3.c 里人家已经把整段代码都extern “C” 括起来了,但是你遇到一个 .c 文件就自觉的再括一次,也没什么不好。

基本工程就这样建立起来了。

编译,可以通过。

但是有一堆的 warning。

可以不管它。

三、 SQLITE操作入门sqlite提供的是一些C函数接口,你可以用这些函数操作数据库。

通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 sqlite 函数,sqlite 就会为你操作数据库。

sqlite 跟MS的access一样是文件型数据库,就是说,一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引、触发器等等,但是,它实际上得到的就是一个文件。

备份这个文件就备份了整个数据库。

sqlite 不需要任何数据库引擎,这意味着如果你需要 sqlite 来保存一些用户数据,甚至都不需要安装数据库(如果你做个小软件还要求人家必须装了sqlserver 才能运行,那也太黑心了)。

下面开始介绍数据库基本操作。

(1)基本流程i.1 关键数据结构sqlite 里最常用到的是 sqlite3 * 类型。

从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。

当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。

下面再详细介绍。

i.2 打开数据库int sqlite3_open( 文件名, sqlite3 ** );用这个函数开始数据库操作。

需要传入两个参数,一是数据库文件名,比如:c://DongChunGuang_Database.db。

文件名不需要一定存在,如果此文件不存在,sqlite 会自动建立它。

如果它存在,就尝试把它当数据库文件来打开。

sqlite3 ** 参数即前面提到的关键数据结构。

这个结构底层细节如何,你不要关它。

函数返回值表示操作是否正确,如果是 SQLITE_OK 则表示操作正常。

相关的返回值sqlite 定义了一些宏。

具体这些宏的含义可以参考 sqlite3.h 文件。

里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。

只要你会看英文,sqlite 可以让你学到不少东西)。

下面介绍关闭数据库后,再给一段参考代码。

i.3 关闭数据库int sqlite3_close(sqlite3 *);前面如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。

下面给段简单的代码:extern "C"{#include "./sqlite3.h"};int main( int , char** ){sqlite3 * db = NULL; //声明sqlite关键结构指针int result;//打开数据库//需要传入 db 这个指针的指针,因为 sqlite3_open 函数要为这个指针分配内存,还要让db指针指向这个内存区result = sqlite3_open( “c://Dcg_database.db”, &db );if( result != SQLITE_OK ){//数据库打开失败return -1;}//数据库操作代码//…//数据库打开成功//关闭数据库sqlite3_close( db );return 0;}这就是一次数据库操作过程。

(2) SQL语句操作本节介绍如何用sqlite 执行标准 sql 语法。

i.1 执行sql语句int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg );这就是执行一条 sql 语句的函数。

第1个参数不再说了,是前面open函数得到的指针。

说了是关键数据结构。

第2个参数const char *sql 是一条 sql 语句,以/0结尾。

第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。

(什么是回调函数,自己找别的资料学习)第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。

等下我们再看回调函数的写法,以及这个参数的使用。

第5个参数char ** errmsg 是错误信息。

注意是指针的指针。

sqlite3里面有很多固定的错误信息。

执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接printf(“%s/n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。

sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个 char*得到具体错误提示。

说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。

填NULL 表示你不需要回调。

比如你做 insert 操作,做 delete 操作,就没有必要使用回调。

而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

i.2 exec 的回调typedef int (*sqlite3_callback)(void*,int,char**, char**);你的回调函数必须定义成上面这个函数的类型。

下面给个简单的例子://sqlite3的回调函数// sqlite 每查到一条记录,就调用一次这个回调int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name ){//para是你在 sqlite3_exec 里传入的 void * 参数//通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),然后在这里面强制转换成对应的类型(这里面是void*类型,必须强制转换成你的类型才可用)。

然后操作这些数据//n_column是这一条记录有多少个字段 (即这条记录有多少列)// char ** column_value 是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组),每一个元素都是一个 char * 值,是一个字段内容(用字符串来表示,以/0结尾)//char ** column_name 跟 column_value是对应的,表示这个字段的字段名称//这里,我不使用 para 参数。

忽略它的存在.int i;printf( “记录包含 %d 个字段/n”, n_column );for( i = 0 ; i < n_column; i ++ ){printf( “字段名:%s ß> 字段值:%s/n”, column_name[i], column_value[i] );}printf( “------------------/n“ );return 0;}int main( int , char ** ){sqlite3 * db;int result;char * errmsg = NULL;result = sqlite3_open( “c://Dcg_database.db”, &db );if( result != SQLITE_OK ){//数据库打开失败return -1;}//数据库操作代码//创建一个测试表,表名叫 MyTable_1,有2个字段: ID 和 name。

相关文档
最新文档