玩转SQLite6:使用C语言来读写数据库

上篇文章介绍了如何使用Pyhton语言来操作SQLite数据库,对于嵌入式开发,更多的是使用C/C++语言进行开发,因此,本篇介绍如何使用C语言来操作SQLite数据库。

1 SQLite C语言API函数

SQLite的C语言API函数的官方文档地址:https://sqlite.com/capi3ref.html#sqlite3_free

玩转SQLite6:使用C语言来读写数据库

对于数据库的基础操控,可以先了解以下几个最基本的API函数:

; 1.1 打开数据库 sqlite3_open

该函数用于打开sqlite3数据库的连接

int sqlite3_open(
  const char *filename,
  sqlite3 **ppDb
);

参数含义:

  • filename: 数据库文件名
  • ppDb: 数据库handle ,用结构体sqlite3来表示一个打开的数据库对象

1.2 执行sql语句 sqlite3_exec

int sqlite3_exec(
  sqlite3*,
  const char *sql,
  int (*callback)(void*,int,char**,char**),
  void *,
  char **errmsg
);

参数含义:

  • sqlite3 *: 数据库句柄
  • sql: 要执行的sql语句
  • callback: 回调函数
  • void *: 回调函数的第一个参数
  • errmsg: 错误信息,如果没有问题则为NULL

1.3 回调函数

回调函数式一个比较复杂的函数,一般用于sql语句执行后的数据打印,其原型为:

int callback(
    void *params,
    int column_size,
    char **column_value,
    char **column_name
);

参数含义:

  • params: sqlite3_exec传入的第四个参数
  • column_size: 结果字段的个数
  • column_value: 返回记录的一位字符数组指针
  • column_name: 结果字段的名称

回调函数的通常写法为:

static int callback(void *data, int argc, char **argv, char **azColName)
{
   int i;
   fprintf(stderr, "%s:\n", (const char*)data);
   for(i=0; i<argc; i++)
   {

        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

1.4 关闭连接 sqlite3_close

int sqlite3_close(sqlite3*);

参数含义:

  • sqlite3 *: 要关闭的数据库句柄

2 C语言编程测试

2.1 编程环境搭建

运行C程序,需要先下载SQLite的源码:https://www.sqlite.org/download.html

玩转SQLite6:使用C语言来读写数据库

我下载的是sqlite-amalgamation-3370000.zip

解压后是两个c文件和两个h文件:

玩转SQLite6:使用C语言来读写数据库

注意,sqlite的源码全部被合并成在一个 sqlite3.c 文件,代码量非常大,目前已有 23万多行代码(如下图),如果不需要修改源码就不用打开该文件因为打开后可能会让你的电脑卡住一会儿。

玩转SQLite6:使用C语言来读写数据库

sqlite3.c添加到工程项目中,并添加头文件的包含路径:

玩转SQLite6:使用C语言来读写数据库

; 2.2 数据插入测试

数据插入就是执行insert语句

const char *sql1="insert into SCORE values(11,77,88,80)";
sqlite3_exec(db, sql1, NULL, NULL, &errmsg);

2.3 数据查询测试

数据插入就是执行select语句

const char *sql2="select * from SCORE";
sqlite3_exec(db, sql2, callback, (void*)data, &errmsg);

2.4 完整的C语言程序

#include
#include "sqlite3.h"

static int callback(void *data, int argc, char **argv, char **azColName)
{
   int i;
   fprintf(stderr, "%s:\n", (const char*)data);
   for(i=0; i<argc; i++)
   {

        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

int main()
{
    const char *sql="select * from SCORE";
    char *errmsg = 0;
    int ret = 0;
    const char* data = "Callback function called";

    sqlite3 *db = 0;
    ret = sqlite3_open("test4.db",&db);
    if(ret != SQLITE_OK)
    {
        fprintf(stderr, "Cannot open db: %s\n", sqlite3_errmsg(db));
        return 1;
    }
    printf("Open database\n");

    ret = sqlite3_exec(db, sql, callback, (void*)data, &errmsg);
    if(ret != SQLITE_OK)
    {
        fprintf(stderr, "sql exec fail: %s\n", errmsg);
    }
    sqlite3_free(errmsg);

    sqlite3_close(db);
    printf("Close database\n");

    return 0;
}

运行结果:

玩转SQLite6:使用C语言来读写数据库

4 总结

本篇简单介绍了如何使用SQLite的C语言API中最基础的几个函数,实现对数据库的读写,后续再介绍其它常用的C语言API函数的用法。

Original: https://blog.csdn.net/hbsyaaa/article/details/122153114
Author: 码农爱学习
Title: 玩转SQLite6:使用C语言来读写数据库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816145/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球