数据库的打开和关闭
数据库的打开(sqlite3_open函数)
sqlite3_open() 函数用于打开一个 SQLite 数据库文件的函数,函数原型如下:
intsqlite3_open(constchar*filename,/* 数据库文件的文件名,如果为 ":memory:" 则表示创建内存中数据库 */sqlite3**ppDb/* 返回指向数据库连接句柄的指针 */);- 这个函数使用指定的数据库文件名(或
:memory:)打开一个新的数据库连接,并且把连接句柄返回给调用者如果连接成功,将会返回SQLITE_OK编码(0),否则将会返回其他错误代码 - 需要注意的是,SQLite 数据库文件不存在时将会自动创建。如果
filename参数为NULL,该函数返回SQLITE_MISUSE(错用 SQLite 调用)错误。ppDb参数是一个二级指针,它将存储一个指向打开的数据库连接的指针,该指针需要在后续的 SQLite 操作中使用 - 例如,以下是在 C 语言中打开一个 SQLite 数据库的示例代码:
#include<stdio.h>#include<sqlite3.h>intmain(){sqlite3*db;/*打开数据库*/intrc=sqlite3_open("test.db",&db);if(rc==SQLITE_OK){printf("已成功打开数据库\n");sqlite3_close(db);// 关闭数据库连接}else{fprintf(stderr,"无法打开数据库: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}return0;}- 在此示例中,打开名为 “test.db” 的 SQLite 数据库连接,并检查是否成功
- 如果连接成功,则输出
"已成功打开数据库"消息,然后关闭连接,否则将会输出错误信息。
数据库的关闭(sqlite3_close函数)
sqlite3_close()函数用于关闭指定数据库连接的函数。函数原型如下:
intsqlite3_close(sqlite3*);- 该函数接收一个被打开的数据库连接指针,如果成功关闭返回
SQLITE_OK编码(0),否则返回其他错误代码 - 在使用完SQLite数据库连接之后,应该释放它以避免资源泄漏和内存占用。调用
sqlite3_close()函数将关闭数据库连接,并释放所有相关的资源,包括已编译的语句等。如果在关闭连接之前还有未完成的事务,则会自动回滚这些事务 - 例如,以下是在 C 语言中关闭 SQLite 数据库连接的示例代码:
#include<sqlite3.h>intmain(){sqlite3*db;intrc=sqlite3_open("test.db",&db);// 执行一些数据库操作// ...rc=sqlite3_close(db);if(rc==SQLITE_OK){printf("Closed database successfully\n");}else{fprintf(stderr,"Can't close database: %s\n",sqlite3_errmsg(db));}return0;}- 在此示例中,在执行所需的 SQLite 操作之后,使用
sqlite3_close()函数关闭数据库连接。如果没有出现错误,则输出 “Closed database successfully” 消息,否则将会输出错误信息
执行SQL语句(sqlite3_exec函数)
sqlite3_exec函数介绍
sqlite3_exec()函数用于在 SQLite 数据库连接上执行一条或多条 SQL 语句,并调用一个回调函数处理执行结果。该函数的原型如下:
intsqlite3_exec(sqlite3*,/* 执行 SQL 命令的数据库连接 */constchar*sql,/* 待执行的 SQL 命令 */int(*callback)(void*,int,char**,char**),/* 在执行命令时的回调函数 */void*,/* 作为第一个参数传递给回调函数的指针 */char**errmsg/* 用于存储错误消息的指针 */);- 该函数接收一个打开的数据库连接
sqlite3*,待执行的 SQL 命令sql,以及一个回调函数callback,可以选择性地传递一个指向用户数据的指针作为回调函数的第一个参数 - 该句话的意思是,回调函数的参数列表(签名)决定了该函数在被调用时应接收哪些参数,并指定了它们的数据类型和顺序。
- 回调函数必须符合以下格式:
int(*callback)(void*,int,char**,char**);- 第一个参数
void*,是使用者传递给sqlite3_exec()调用的void*参数。 - 第二个参数
int,是查询结果所返回的列数。 - 第三个参数
char**,是包含每个结果集元素值的字符串数组。 - 第四个参数
char**,是包含每个结果集元素的列名称的字符串数组。这通常会在 SELECT 语句中返回。 - 回调函数的返回值应为整数,并且通常全部返回0表示执行成功。如果需要提前终止查询或在回调函数过程中发现错误,可以返回非零值
errmsg是用于保存sqlite3_exec()返回的错误消息的指针- 当函数成功执行 SQL 命令时,将会返回
SQLITE_OK编码(0),否则将会返回其他错误代码。如果在执行命令时发生错误,则errmsg将被设置为一个非空值,其中包含有关错误的详细信息。如果errmsg未被设置,则表示该函数执行成功。
sqlite3_exec()函数应用
使用sqlite3_exec()函数创建表
- 以下是一个使用
sqlite3_exec()函数执行 SQL 命令的示例代码:
#include<sqlite3.h>#include<stdio.h>intmain(intargc,char*argv[]){sqlite3*db;char*zErrMsg=0;intrc;/*打开数据库*/rc=sqlite3_open("test.db",&db);if(rc){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}else{fprintf(stdout,"Opened database successfully\n");}/*创建表的SQL语句*/char*sql="CREATE TABLE COMPANY(""ID INT PRIMARY KEY NOT NULL,""NAME TEXT NOT NULL,""AGE INT NOT NULL);";/*执行SQL语句*/rc=sqlite3_exec(db,sql,0,0,&zErrMsg);if(rc!=SQLITE_OK){fprintf(stderr,"SQL error: %s\n",zErrMsg);sqlite3_free(zErrMsg);}else{printf("Table created successfully\n");}/*关闭数据库文件*/sqlite3_close(db);return0;}- 上述代码中,首先调用sqlite3_open()函数打开一个名为"test.db"的数据库连接,然后使用CREATE TABLE语句创建一张名为"COMPANY"的表格
- 该表格包含三列,分别是"id"、“name"和"age”
- 其中,id列被定义为主键(PRIMARY KEY),且不能为NULL
- 接下来,通过调用sqlite3_exec()函数执行SQL语句,将该语句传递给SQLite引擎进行解析和执行
- 如果执行成功,则输出"Table created successfully",否则输出具体的错误消息
使用sqlite3_exec()函数向表中插入数据
- 创建好表格以后我们就可以向其添加数据了:
#include<sqlite3.h>#include<stdio.h>intmain(intargc,char*argv[]){sqlite3*db;char*zErrMsg=0;intrc;/*打开数据库*/rc=sqlite3_open("test.db",&db);if(rc){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}else{fprintf(stdout,"Opened database successfully\n");}/*创建表的SQL语句*/char*sql="INSERT INTO COMPANY (ID,NAME,AGE) VALUES (1, '张三', 32);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (2, '李四', 33);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (3, '王五', 30);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (4, '王博', 32);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (5, '李为', 33);""INSERT INTO COMPANY (ID,NAME,AGE) VALUES (6, '赵倩', 30);";/*执行SQL语句*/rc=sqlite3_exec(db,sql,0,0,&zErrMsg);if(rc!=SQLITE_OK){fprintf(stderr,"SQL error: %s\n",zErrMsg);sqlite3_free(zErrMsg);}else{fprintf(stdout,"Records created successfully\n");}/*关闭数据库文件*/sqlite3_close(db);return0;}- 在上述代码中,需要先调用sqlite3_open()函数打开数据库连接。然后,使用INSERT INTO语句将一条记录插入到"COMPANY"表格中
- 该记录包含三个字段,分别是"id"、“name"和"age”,对应的值分别为1、'张三’和32。最后,通过sqlite3_exec()函数执行SQL语句,并根据返回值判断操作是否成功
使用sqlite3_exec()函数查询数据
#include<sqlite3.h>#include<stdio.h>// 回调函数intcallback(void*data,intargc,char**argv,char**azColName){inti;printf("callback:\n");for(i=0;i<argc;i++){printf("%s = %s\n",azColName[i],argv[i]?argv[i]:"NULL");}printf("\n");return0;}intmain(){sqlite3*db;char*zErrMsg=0;// 存储错误消息的指针intrc;rc=sqlite3_open("test.db",&db);if(rc!=SQLITE_OK){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}constchar*sql="SELECT * from COMPANY";rc=sqlite3_exec(db,sql,callback,NULL,&zErrMsg);if(rc!=SQLITE_OK){fprintf(stderr,"SQL error: %s\n",zErrMsg);sqlite3_free(zErrMsg);}else{printf("Operation done successfully\n");}sqlite3_close(db);returnrc;}- 在此示例中,我们定义了一个回调函数
callback(),该函数用于处理sqlite3_exec()执行结果。
接下来,我们打开一个名为 “test.db” 的 SQLite 数据库连接,并执行 SELECT 命令 - 最后,我们通过检查
rc和zErrMsg的返回值,判断查询是否成功并处理执行结果
void *data的作用是什么?
- void *data是sqlite3_exec()函数的第四个参数,它是一个用户定义的指针类型,提供了一个通用的方法来传递额外的数据给回调函数。sqlite3_exec()函数的高级用法
- 示例代码:
#include<sqlite3.h>#include<stdio.h>// 回调函数intcallback(void*data,intargc,char**argv,char**azColName){inti;if(argv[0][0]=='1')printf("%s\n",(char*)data);for(i=0;i<argc;i++){printf("%s\t",argv[i]?argv[i]:"NULL");}printf("\n");return0;}intmain(){sqlite3*db;char*zErrMsg=0;// 存储错误消息的指针intrc;rc=sqlite3_open("test.db",&db);if(rc!=SQLITE_OK){fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return1;}char*str="ID\t名字\t年龄";char*sql="SELECT * from COMPANY";rc=sqlite3_exec(db,sql,callback,str,&zErrMsg);if(rc!=SQLITE_OK){fprintf(stderr,"SQL error: %s\n",zErrMsg);sqlite3_free(zErrMsg);}else{printf("Operation done successfully\n");}sqlite3_close(db);returnrc;}