当前位置: 首页 > article >正文

操作数据库的API

操作数据库的API

API官方地址:操作数据库的API

打开数据库

首先要加入头文件
#include "sqlite3.h"

int sqlite3_open(
  const char *filename,   //数据库的路径
  sqlite3 **ppDb          //sqlite数据库句柄,二级指针
);
返回值:
成功:SQLITE_OK
失败:将返回错误代码
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

关闭数据库

int sqlite3_close(sqlite3*);
参数:
sqlite3*:打开数据库的句柄指针
返回值:
成功:SQLITE_OK
失败:错误代码
------------------------------------------
//关闭数据库
	ret = sqlite3_close(DB);
	if(ret!=SQLITE_OK)
	{
		printf("数据库关闭失败!\n");
		return -1;
	}

执行sql语句

执行(sqlite3_exec)

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)

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

注意:主要记住这里的两级三级指针,传参

查询有两种方法,可以参考以下代码

#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;
}

http://www.kler.cn/a/372717.html

相关文章:

  • yocto 下基于SDK的 tcpdump 移植
  • java:入门基础(1)
  • Mac程序坞窗口预览的方法来了
  • 【论文精读】ID-like Prompt Learning for Few-Shot Out-of-Distribution Detection
  • ssm+vue645基于web的电影购票系统设计与实现
  • 软考:软件建模的抽象级别
  • 【AI应用】大模型工具如何助力文字创意工作(提示词Prompt+谷歌NotebookLM)
  • 提取excel信息
  • Three.js Shader 与自定义材质—深入理解与应用
  • 思科--交换网络综合实验
  • 电动车进入电梯数据集、自行车进入电梯数据集 电动车进入电梯VOC数据标注数据集
  • 【错误描述:“L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误”】
  • App开发Flutter支持Harmony OS Next方案
  • python通过keyboard库实现模拟/监听键盘
  • Spring Security使用
  • 使用three.js 实现 自定义绘制平面的效果
  • Golang 并发编程入门:Goroutine 简介与基础用法
  • 适配器模式:连接不兼容接口的桥梁
  • NVR小程序接入平台/设备EasyNVR多个NVR同时管理多平台级联与上下级对接的高效应用
  • Nginx 的讲解和案例示范
  • SpringBoot+VUE2完成WebSocket聊天(数据入库)
  • ‌MySQL中‌between and的基本用法‌
  • macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程
  • 【Mac】安装 F5-TTS
  • 阿里云ECS访问GitHub解决方案
  • 公共命名空间,2024年10月的笔记