数据库编程(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 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
美林数据Tempodata4 小时前
大模型驱动数据分析革新:美林数据智能问数解决方案破局传统 BI 痛点
数据库·人工智能·数据分析·大模型·智能问数
野槐4 小时前
node.js连接mysql写接口(一)
数据库·mysql
Zzzone6835 小时前
PostgreSQL日常维护
数据库·postgresql
chxii5 小时前
1.13使用 Node.js 操作 SQLite
数据库·sqlite·node.js
冰刀画的圈5 小时前
修改Oracle编码
数据库·oracle
这个胖子不太裤5 小时前
Django(自用)
数据库·django·sqlite
麻辣清汤5 小时前
MySQL 索引类型及其必要性与优点
数据库·mysql
2501_915374356 小时前
Neo4j 图数据库安装教程(2024最新版)—— Windows / Linux / macOS 全平台指南
数据库·windows·neo4j
it-搬运工7 小时前
3.图数据Neo4j - CQL的使用
数据库·neo4j