操作数据库的API
API官方地址:操作数据库的API
打开数据库
首先要加入头文件
#include "sqlite3.h"
c
int sqlite3_open(
const char *filename, //数据库的路径
sqlite3 **ppDb //sqlite数据库句柄,二级指针
);
返回值:
成功:SQLITE_OK
失败:将返回错误代码
c
int main()
{
// 创建句柄
sqlite3 *DB;
// 打开数据库
int ret = sqlite3_open("./data.db", &DB);
if (ret != SQLITE_OK)
{
printf("数据库打开失败!\n");
return -1;
}
return 0;
}
gcc 17.c sqlite3.c -o main -lpthread -ldl //文件运行后缀 -lpthread -ldl
关闭数据库
c
int sqlite3_close(sqlite3*);
参数:
sqlite3*:打开数据库的句柄指针
返回值:
成功:SQLITE_OK
失败:错误代码
------------------------------------------
//关闭数据库
ret = sqlite3_close(DB);
if(ret!=SQLITE_OK)
{
printf("数据库关闭失败!\n");
return -1;
}
执行sql语句
执行(sqlite3_exec)
c
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
参数:
sqlite3*:打开数据库的句柄
const char *sql:需要执行的sql语句
int (*callback)(void*,int,char**,char**):回调函数 NULL
void *:给回调函数提供参数 NULL
char **errmsg :错误信息 NULL
如果sql语句是查询语句,则需要回调函数获取数据,非查询语句可以直接写NULL
int (*callback)(void* arg,int col,char** str,char** name)
参数:
void* arg:提供的参数
int col:返回结果有多少列
char** str:字段列对应的数据
char** name:对应的字段名
查询(sqlite3_get_table)
c
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 */
);
参数:
sqlite3 *db:数据库句柄
const char *zSql:需要执行的sql语句
char ***pazResult:返回查询的结果
int *pnRow:结果的行数
int *pnColumn:结果的列数
char **pzErrmsg:错误信息 NULL
注意:主要记住这里的两级三级指针,传参
查询有两种方法,可以参考以下代码
c
#include <stdio.h>
#include "sqlite3.h"
// 建表
int create_table(sqlite3 *DB)
{
char *sql = "create table if not exists students(name text unique,age int)";
int ret = sqlite3_exec(DB, sql, NULL, NULL, NULL);
if (ret != SQLITE_OK)
{
printf("建表失败!\n");
return -1;
}
}
// 新增数据
int add_data(sqlite3 *DB)
{
char name[20] = {0};
int age = 0;
char bufsql[100] = {0}; // 保存sql语句
printf("请输入姓名年龄:");
scanf("%s %d", name, &age);
sprintf(bufsql, "insert into students values('%s',%d)", name, age);
int ret = sqlite3_exec(DB, bufsql, NULL, NULL, NULL);
if (ret != SQLITE_OK)
{
printf("插入数据失败!\n");
return -1;
}
}
// 删除数据
int delete_data(sqlite3 *DB)
{
char name[20] = {0};
char bufsql[100] = {0}; // 保存sql语句
printf("请输入要删除的数据:");
scanf("%s", name);
sprintf(bufsql, "delete from students where name='%s'", name);
int ret = sqlite3_exec(DB, bufsql, NULL, NULL, NULL);
}
// 回调函数
int callback(void *arg, int col, char **str, char **name)
{
for (int i = 0; i < col; ++i)
{
printf("name[%d]:data[%d]==>%s,%s\n", i, i, name[i], str[i]);
}
return 0; // 注意,查询成功要返回0,否则只能查出一条数据
}
// 查询数据
int show_data(sqlite3 *DB)
{
char bufsql[100] = "select * from students";
int ret = sqlite3_exec(DB, bufsql, callback, NULL, NULL);
if (ret != SQLITE_OK)
{
printf("查询失败!\n");
return -1;
}
return 0;
}
// 查询第二种方法
int show_data2(sqlite3 *DB)
{
char **Result;
int row, col;
int ret = sqlite3_get_table(DB, "select * from students", &Result, &row, &col, NULL);
if (ret != SQLITE_OK)
{
printf("查询失败!\n");
return -1;
}
else
{
printf("获取到sql语句的行和列的数量:%d %d\n", row, col);
for (int i = 0; i < (row + 1) * col; i += 2)
{
printf("%s %s\n", Result[i], Result[i + 1]);
}
}
}
int main()
{
// 创建句柄
sqlite3 *DB;
// 打开数据库
int ret = sqlite3_open("../db/stuinfo.db", &DB);
if (ret != SQLITE_OK)
{
printf("数据库打开失败!\n");
return -1;
}
// 建表
create_table(DB);
// // 加入数据
add_data(DB);
// // 删除数据
delete_data(DB);
// 查询数据
show_data2(DB);
int res = sqlite3_close(db);
if (res != SQLITE_OK)
{
printf("close db failed\n");
return -1;
}
return 0;
}