数据库编程(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;
}

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

相关推荐
movie__movie4 分钟前
Spring AI MCP 客户端实战:轻松连接高德地图等工具
数据库·人工智能·spring
清风19815 分钟前
kafka消息可靠性传输语义
数据库·分布式·kafka
数据智能老司机2 小时前
CockroachDB权威指南——SQL调优
数据库·分布式·架构
数据智能老司机2 小时前
CockroachDB权威指南——应用设计与实现
数据库·分布式·架构
数据智能老司机3 小时前
CockroachDB权威指南——CockroachDB 模式设计
数据库·分布式·架构
数据智能老司机21 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机1 天前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿1 天前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
无名之逆1 天前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601011 天前
rust 同时处理多个异步任务
java·数据库·rust