本篇介绍如何使用C语言来操作SQLite数据库。

1. SQLite C语言API函数

SQLite的C语言API函数的官方文档地址:C/C++ Interface For SQLite Version 3

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

(1)sqlite3_open函数

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

原型:

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

参数说明:

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

(2)sqlite3_exec函数

sqlite3_exec函数用于执行sql语句。

原型:

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

参数说明:

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

(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++) // argc:结果字段的个数 
   {
   		// azColName:结果字段的名称,  argv:字符数组指 
		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");

   return 0;
}

(4)sqlite3_close函数

sqlite3_close函数用于关闭sqlite3数据库的连接。

原型:

int sqlite3_close(sqlite3 *);

参数说明:

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

2. C语言编程接口

(1)编程环境搭建

运行C程序,需要先下载SQLite的源码:SQLite Download Pagel。

下载的是sqlite-amalgamation-3510200.zip。

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

注意:

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

sqlite3.c添加到工程项目中,并添加头文件的包含路径。具体步骤视个人具体情况而异,在此略。

(2)数据插入测试

数据插入就是执行insert语句:

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

(3)数据查询测试

数据插入就是执行select语句:

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

3. 完整的C语言程序

#include <stdio.h>
#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++) // argc: 结果字段的个数 
   {
   		// azColName:结果字段的名称,  argv:字符数组指 
		printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");

   return 0;
}

int main(void)
{
    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");

    // 执行sql语句
    //ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    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;
}

4. 总结

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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐