数据库编程(sqlite3)

一:数据库分类

复制代码
常用的数据库
大型数据库 :Oracle
    商业、多平台、关系型数据库
    功能最强大、最复杂、市场占比最高的商业数据库
中型数据库 :Server是微软开发的数据库产品,主要支持windows平台 
小型数据库 : mySQL是一个小型关系型数据库管理系统。开放源码、目前使用最广泛、流行度最高的的开源数据库

SQLite基础
 SQLite的源代码是C,其源代码完全开放。它是一个轻量级的嵌入式数据库。
 SQLite有以下特性: 
     	零配置------------无需安装和管理配置; 
     	储存在单一磁盘文件中的一个完整的数据库; 
     	数据库文件可以在不同字节顺序的机器间自由共享; 
     	支持数据库大小至2TB(1024G = 1TB);足够小,全部源码大致3万行c代码,250KB; 
        比目前流行的大多数数据库对数据的操作要快

二:源码安装与测试

复制代码
tar xf sqlite-autoconf-3460000.tar.gz
cd  sqlite-autoconf-3460000
./configure
make
sudo make install

测试:

cs 复制代码
sqlite3 -version 
3.46.0 2024-05-23

三:基础语句链接

【腾讯文档】sqlite基础SQL语句使用

sqlite基础SQL语句使用

四:函数接口
cs 复制代码
文件:#include <sqlite3.h>
编译:gcc sqlite1.c -lsqlite3

1.int sqlite3_open(char  *path, sqlite3 **db);

功能:打开sqlite数据库,如果数据库不存在则创建它
path: 数据库文件路径
db: 指向sqlite句柄的指针
返回值:成功返回SQLITE_OK,失败返回错误码(非零值)

2.int sqlite3_close(sqlite3 *db);

功能:关闭sqlite数据库
返回值:成功返回SQLITE_OK,失败返回错误码

返回值:返回错误信息

3.执行sql语句接口
int sqlite3_exec(
  sqlite3 *db,                                  /* An open database */
  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 */
);

功能:执行SQL操作
db:数据库句柄
sql:要执行SQL语句
callback:回调函数(满足一次条件,调用一次函数,用于查询)
    再调用查询sql语句的时候使用回调函数打印查询到的数据
arg:传递给回调函数的参数
errmsg:错误信息指针的地址
返回值:成功返回SQLITE_OK,失败返回错误码

回调函数:
 int (*sqlite3_callback)(void *para, int f_num, 
         char **f_value, char **f_name);

功能:select:每找到一条记录自动执行一次回调函数
para:传递给回调函数的参数(由 sqlite3_exec() 的第四个参数传递而来)
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组(列值)
f_name:包含每个字段名称的指针数组(列名)
返回值:成功返回SQLITE_OK,失败返回-1,每次回调必须返回0后才能继续下次回调

4.不使用回调函数执行SQL语句(只用于查询)
int sqlite3_get_table(sqlite3 *db, const  char  *sql, 
   char ***resultp,  int *nrow,  int *ncolumn, char **errmsg);

功能:执行SQL操作
db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针
nrow:满足条件的记录的数目(但是不包含字段名(表头 id name score))
ncolumn:每条记录包含的字段数目
errmsg:错误信息指针的地址

返回值:成功返回SQLITE_OK,失败返回错误码

5.返回sqlite3定义的错误信息
char *sqlite3_errmsg(sqlite3 *db);
五:函数编程
cs 复制代码
#include <stdio.h>
#include <sqlite3.h>
#include <errno.h>

// int callback(void *arg, int f_num, char **f_val, char **f_name)
// {
//     for (int i = 0; i < f_num; i++)
//     {
//         printf("%s\n", f_val[i]);
//     }
//     return 0;
// }

int main(int argc, char const *argv[])
{
    sqlite3 *db;
    if (sqlite3_open("./stu.db", &db) != SQLITE_OK)
    {
            fprintf(stderr, "sqlite3_open err%s\n", sqlite3_errmsg(db));
            return -1;
    }
    char *errmsg = NULL;
    // 创建表
    if (sqlite3_exec(db, "create table stu3(id int,name char,score float);", NULL, NULL, &errmsg) != SQLITE_OK)
    {
        fprintf(stderr, "create table stu3 err:%s\n", errmsg);
        //return -1;//注释之后追加
    }
    printf("sqlites ok\n");

    // 插入数据,依次插入
    int num, id;
    char name[32];
    float score;
    char sql[128];
    printf("please input you num:");
    scanf("%d", &num);
    for (int i = 0; i < num; i++)
    {
        scanf("%d %s %f", &id, name, &score);
        sprintf(sql, "insert into stu3 values(%d ,\"%s\" ,%f);", id, name, score);
        printf("%s\n", sql);

        if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
        {
            fprintf(stderr, "create table stu3 err%s\n", errmsg);
            return -1;
        }
    }
    // 查询
    // if (sqlite3_exec(db, "select id,score from stu3;", callback, "hello", &errmsg) != SQLITE_OK)
    // {
    //     fprintf(stderr, "select err:%ss\n", errmsg);
    //     return -1;
    // }
    char **result = NULL;
    int hang, lie, k = 0;
    if (sqlite3_get_table(db, "select id,score from stu3;", &result, &hang, &lie, &errmsg) != SQLITE_OK)
    {
        fprintf(stderr, "select err:%ss\n", errmsg);
        return -1;
    }
    printf("hang%d:lie%d\n", hang, lie);
    for (int i = 0; i < hang + 1; i++)
    {
        for (int i = 0; i < lie; i++)
            printf("%s\n", result[k++]);
        printf("\n");
    }
    sqlite3_close(db);
    return 0;
}

注释:在数据库编程中,最终的编译阶段需要链接他们的库函数

相关推荐
摇滚侠7 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
川石课堂软件测试8 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
2501_937767169 小时前
自建 SQL 数据库定时备份踩坑复盘与落地思路
数据库·sql
silvamux_10 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
I Am a robert girl12 小时前
从 GameHorizon 拆解多时间尺度游戏评测:数据管线、离线基准与在线回放的三层设计
数据库·游戏·多时间尺度·数据管线·游戏评测·离线基准·在线回放
躺柒12 小时前
读数据安全架构设计与实践17安全架构案例(下)
数据库·安全·零信任·安全架构·防火墙·无边界
SelectDB12 小时前
实时更新排错现场:导入了却查到旧数据,和 FINAL 越加越慢的两条路
大数据·数据库·数据分析
SelectDB13 小时前
拿 Planet 的账单一行行对下来,我总结出三个可自查的校验点
大数据·数据库·数据分析
SelectDB13 小时前
Apache Doris + Vane:让多模态数据进入业务分析
大数据·数据库·数据分析
pjj1985415 小时前
ClickHouse 与 Doris 数据库技术梳理:看懂分析型数据库
数据库·clickhouse