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

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

相关推荐
广州智造3 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥6 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸7 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1237 小时前
Redis解析
数据库·redis·缓存
数据库幼崽7 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd8 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou8 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh9 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵10 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多11 小时前
Linux——mysql主从复制与读写分离
数据库·mysql