目录
sqlite3安装步骤
sqlite3基本命令
进入sqlite模式命令
系统命令(点命令--以"."开头)
sqlite语句(以";"结尾)
sqlite相关函数C/C++接口(头文件#include )
sqlite3_open()
sqlite3_close()
sqlite3_exec()
回调函数:
sqlite3_get_table()
sqlite3_free_table()
sqlite3_free()
代码示例
sqlite3_exec()回调与不回调查询数据库
sqlite3_get_table()不回调查询数据库
sqlite3安装步骤
sqlite3版本:sqlite-autoconf-3310100
平台:ubuntu
以下 *** 作需要sudo权限
①从官网下载对应的压缩包
lyt598@ubuntu:~$ wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
②对压缩包进行解压
lyt598@ubuntu:~$ tar -xzvf sqlite-autoconf-3310100.tar.gz
③进入到解压的文件夹内
lyt598@ubuntu:~$cd sqlite-autoconf-3310100/
④运行相应的配置文件
lyt598@ubuntu:~/sqlite-autoconf-3310100$ ./configure
⑤执行make命令,这一步比较慢,进行编译源程序,请耐心等待
lyt598@ubuntu:~/sqlite-autoconf-3310100$ make
注:如果这步执行有误,可以先执行make clean,先清除之前安装的sqlite3
⑥执行make install命令,需要sudo权限进行安装,否则会出错
lyt598@ubuntu:~/sqlite-autoconf-3310100$ sudo make install
./configure、make、make install相关命令解析
sqlite3基本命令 进入sqlite模式命令
sqlite3 进入sqlite模式,在命令提示行后输入
也可以直接sqlite3 数据库名 直接进入对应数据库,若该数据库不存在则就创建
系统命令(点命令--以"."开头)①.help 帮助命令
②.quit 退出命令
③.show 查看 SQLite 命令提示符的默认设置
④.database (s)查看打开的数据库,以及他们的路径
⑤.open xx.db 打开对应的数据库,若不存在则创建
⑥.table(s) 查看对应数据库下的表(只显示表名)
⑦.schema 查看指定表的创建语句
sqlite语句(以";"结尾)①增加 CREATE、INSERT、ALTER
- 创建表 CREATE TABLE temperdata (id int, date char, temper char);
- 插入数据 INSERT INTO "temperdata" VALUES(1, "2022-04-09", "28.5C");
- 插入部分数据 INSERT INTO temperdata(id, temper) VALUES(2, "28.6C");
- 添加一列 ALTER TABLE temperdata ADD place char
②删除 DROP、DELETE
- 删除表 DROP TABLE temperdata
- 删除表中某些记录 DELETE FROM temperdata WHERE id=1;
- (删除数据库的话,可以直接把xx.db文件删除)
③修改 UPDATE
- UPDATE temperdata SET temper=“29.1C” WHERE id=1;
④查看 SELECT
- 查看整个表内容 SELECT * FROM "temperdata";
- 查看表中的部分记录 SELECT date, temper FROM temperdata WHERE id=2;
sqlite相关函数C/C++接口(头文件#include
int sqlite3_open(const char *filename, sqlite3 **ppDb);
功能描述:打开一个数据库,如果该数据库不存在,sqlite则会自动创建
参数解析:①第一个参数是特定文件名(xx.db)
②第二个参数是sqlite3 **结构体指针,成为数据库句柄(相当于是数据库的描述符)
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)
sqlite3 *db;
sqlite3_open("temperdata.db", &db);
sqlite3_close()
int sqlite3_close(sqlite3 *)
功能描述:关闭之前调用的数据库连接,所有与连接相关的语句都应该在关闭之前完成
参数解析:就是先前连接定义的数据库句柄(相当于数据库描述符)
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值),其中如果是查询没有完成,则返回SQLITE_BUSY
sqlite3 *db;
sqlite3_close(db);
sqlite3_exec()
int sqlite3_exec(sqlite3 *, const char *sql, int (*callback)(void *, int, char **, char **),
void *data, char **errmsg)
功能描述:编译和执行sql语句,将查询到的结果返回给回调函数callback
参数解析:
①第一个参数是打开的数据库句柄
②第二个参数是一个字符指针,表示所要执行的sql语句字符串,以'\0'结尾
③第三个参数是一个回调函数,用来处理查询结果,如果不需要回调则NUL填L(比如insert或delete *** 作时),一般用于SELECT
④第四个参数是传给回调函数的指针参数,如果不需要传递,则值填NULL
⑤第五个参数是返回错误信息,这里是指针的指针
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)
注意:使用回调会显得代码整齐
回调函数:回调函数:是由函数指针调用的函数。
在c代码编程中可以这样理解,函数F1调用函数F2的时候,通过参数给函数F2传递了另一个函数F3的指针,在函数F2执行的时候,函数F2调用了F3,这个动作叫做回调(Callback),而先被当作指针参数传入、然后又被回调的函数F3就是回调函数(也叫钩子函数Hook)
typedef int (*sqlite_callback)(void *para, int columncount, char **columnvalue,
char **columnname);
功能描述:由用户处理查询的结果
参数解析:
①第一个参数para指针,是sqlite3_exec()传入的指针参数
②第二个参数columncount是查询到的这一条记录共有多少个字段(相当于多少列)
③第三个参数columnvalue将查询出来的数据都保持在这里,这是一个一维数组,每一个元素都是一个char *值,是一个字段内容(用字符串来表示)
④第四个参数columnname是与columnvalue对应的,也是一个一维数组,代表这个字段名称
返回值:执行成功则返回SQLITE_OK(0),否则返回其他值(非0)
PS:回调函数执行一次或n次,大多数情况下是会循环执行n次。
当我们进行SELSCT查询的时候,输出的结果有几行,就会执行几次回调函数
sqlite3_get_table()注意:前面sqlite3_exec()使用回调会显得代码整齐,但是有时候想要使用非回调的SELECT查询,就可以使用sqlite3_get_table()
int sqlite3_get_table( sqlite3 *db, /* An open database */ const char *zSql, /* SQL to be evaluated */ char ***pazResult, /* Results of the query */ int *pnRow, /* Number of result rows written here */ int *pnColumn, /* Number of result columns written here */ char **pzErrmsg /* Error msg written here */ );
功能描述:主要是用于以非回调的方式进行SELECT查询
参数解析:
①第一个参数是一个数据库句柄,是打开数据库得到的指针
②第二个参数是一条sql语句,与sqlite3_exec()中的一样,以'\0'结尾的字符串
③第三个参数是查询的结果,是一个一维数组,它的内存布局是:字段名称,后面是紧接着每个字段的值(就是列表名,后面跟着一个一个数据)
④第四个参数是查询出多少条记录(即查出多少行,不包括字段名的那一行)
⑤第五个参数是有多少字段(多少列)
⑥第五个参数是返回错误信息,这里是指针的指针
返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)
注意:第三个参数pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),包括字段名
sqlite3_free_table()void sqlite3_free_table(char **result)
功能描述:用来释放保存查询内容的指针数组
参数解析:是sqlite3_get_table()的第三个参数的查询结果
无返回值
sqlite3_free()void sqlite3_free(void *)
功能描述:用来释放存放错误信息的内存空间,如果由错误发生,就要释放内存
参数描述:错误信息指针
无返回值
char *zerrmsg;
sqlite3_free(zerrmsg);
代码示例 sqlite3_exec()回调与不回调查询数据库
linyuting@Raspberrypi4B:~$vim test.c
#include
#include
#include
#include
#include
static int callback(void *para, int argc, char **argv, char **cname);
int main(int argc, char **argv)
{
int rc = 0;
sqlite3 *db = NULL;
char *sql;
char *sql1;
char *sql2;
char *sql3;
char *data = "Callback function called";
char *zerrmsg = NULL;
//1、打开数据库,不存在,则创建它
rc = sqlite3_open("testsqlite.db", &db);
if( rc < 0 )
{
printf("open the database failure: %s\n", strerror(errno));
return -1;
}
printf("open the testsqlite.db successfully.\n");
//2、在该数据库中创建表,若表存在,则就不创建
sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
ID INT PRIMARY KEY,\
NAME TEXT,\
AGE INT\
);";
if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
{
printf("create the table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -2;
}
printf("create the table successfully.\n");
//3、往表中插入数据,这是sqlite3_exec()非回调的使用
sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
{
printf("insert the message into table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -3;
}
printf("insert the message into table successfully.\n");
sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
{
printf("insert the message into table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -4;
}
printf("insert the message into table successfully.\n");
//4.从表中查询数据,这是sqlite3_exec()回调的调用
sql3 = "SELECT * FROM STUDENT";
if( sqlite3_exec(db, sql3, callback, (void *)data, &zerrmsg) != SQLITE_OK )
{
printf("select from table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -5;
}
printf("select from table successfully.\n");
sqlite3_close(db);
return 0;
}
//回调函数
static int callback(void *para, int argc, char **argv, char **cname)
{
int i;
printf("%s\n", (char *)para);
printf("the table column is %d\n", argc);
for(i=0; i
linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3(注意在编译的时候一定要加上-sqlite3,包含相关的头文件,否则会出错)
linyuting@Raspberrypi4B:~$./test
由此可见,因为有两条记录,相当于输出两行,所以回调函数执行两次。
linyuting@Raspberrypi4B:~$vim test.c
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
int rc = 0;
int i = 0;
sqlite3 *db = NULL;
char *sql;
char *sql1;
char *sql2;
char *sql3;
char **result;
int nrow = 0;
int ncolumn = 0;
char *zerrmsg = NULL;
//1、打开数据库,不存在,则创建它
rc = sqlite3_open("testsqlite.db", &db);
if( rc < 0 )
{
printf("open the database failure: %s\n", strerror(errno));
return -1;
}
printf("open the testsqlite.db successfully.\n");
//2、在该数据库中创建表
sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
ID INT PRIMARY KEY,\
NAME TEXT,\
AGE INT\
);";
if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
{
printf("create the table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -2;
}
printf("create the table successfully.\n");
//3.往表中插入数据,这是sqlite3_exec()非回调的使用
sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
{
printf("insert the message into table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -3;
}
printf("insert the message into table successfully.\n");
sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
{
printf("insert the message into table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -4;
}
printf("insert the message into table successfully.\n");
//4、查询表中数据,这里使用的是sqlite3_get_table()非回调方法
sql3 = "SELECT * FROM STUDENT";
if( sqlite3_get_table(db, sql3, &result, &nrow, &ncolumn, &zerrmsg) != SQLITE_OK )
{
printf("select from table failure: %s\n", strerror(errno));
sqlite3_free(zerrmsg);
return -5;
}
printf("select from table successfully.\n");
printf("the total row is %d, column is %d\n", nrow, ncolumn);
printf("the result is:\n");
//将查询到的结果,通过数组遍历出来
for(i=0; i<(nrow+1)*(ncolumn); i++)
{
printf("%s\n", result[i]);
}
sqlite3_close(db);
return 0;
}
linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3
linyuting@Raspberrypi4B:~$./test
由此可见,sqlite3_get_table()非递归调用的代码没有sqlite3_exec()递归调用显得整齐。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)