【精品教程】C++ SQLite 3使用【1】 – QADoor 问答门
QADoor 问答门

【精品教程】C++ SQLite 3使用【1】

翻译来源于:SQLite C tutorial

SQLite 数据库

SQLite是一个嵌入式关系数据库引擎。它的开发人员称其为一个独立的,无服务器的,零配置的和事务性的SQL数据库引擎。目前它非常受欢迎,代码的拷贝量达到了数亿次。 SQLite已经在Solaris 10和Mac OS,Android或在iPhone中使用。Qt4库内置了对SQLite以及Python和PHP的支持。许多流行的应用程序在内部使用SQLite,如Firefox,Google Chrome或Amarok。

SQLite 3 命令行

sqlite3工具是基于终端的SQLite库的前端。它以交互方式评估查询并以多种格式显示结果。它也可以在脚本中使用。它有自己的一套元命令,包括.tables.load.databases.dump 。想查看更多的命令,我们可以通过输入 .help 命令进行查看。

现在我们通过sqlite3命令去创建一个新的数据库:

sqlite3 test.db

我们通过在sqlite3命令后边跟上一个参数 test.db,意思就是创建一个 test.db 数据库,如果这个文件在我们磁盘上存在,那就打开,如果不存在,sqlite3会自动创建。

打开 test.db 数据库后,我们就可以通过命令: .tables 去查看 test.db 中的数据表。

通过命令 .exit 退出sqlite3工具。通过 ls 命令,我们可以看到,sqlite3的确帮我们创建了一个 test.db 的数据库。

动态演示效果图:

 

下面我们开始今天的主题,用C/C++语言来调用SQLite 3的操作。

SQLite Version

在第一个示例代码中,我们将通过SQLite 3的API来获取SQLite数据库的版本信息。

version.c:

#include <sqlite3.h>
#include <stdio.h>

int main(void) {
    
    printf("%s\n", sqlite3_libversion()); 
    
    return 0;
}

 

编译命令:

gcc -o version version.c -lsqlite3

运行结果:

[root@localhost sqlite3_tutorial]# ./version 
3.21.0

说明:<sqlite3.h>这个头文件定义了SQLite库提供给客户端程序的接口。它包含定义,函数原型和注释。它是SQLite API的权威来源。

在第二个示例中,我们将通过SQL查询,来获取SQLite的版本:

query_version.c:

#include <sqlite3.h>
#include <stdio.h>

int main(void) {
    
    sqlite3 *db;
    sqlite3_stmt *res;
    
    int rc = sqlite3_open(":memory:", &db);
    
    if (rc != SQLITE_OK) {
        
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    }
    
    rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0);    
    
    if (rc != SQLITE_OK) {
        
        fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    }    
    
    rc = sqlite3_step(res);
    
    if (rc == SQLITE_ROW) {
        printf("%s\n", sqlite3_column_text(res, 0));
    }
    
    sqlite3_finalize(res);
    sqlite3_close(db);
    
    return 0;
}

 

[root@localhost sqlite3_tutorial]# gcc query_version.c -o query_version -lsqlite3
[root@localhost sqlite3_tutorial]# ./query_version 
3.21.0
[root@localhost sqlite3_tutorial]#

我们可以看到,通过SQL查询和通过SQLite3的API接口查询到的结果是一致的。

说明

SQLITE_VERSION()查询用于获取SQLite库的版本

sqlite3 *db;

sqlite3结构定义了一个数据库句柄。每个打开的SQLite数据库都由一个数据库句柄表示。

sqlite3_stmt *res;

sqlite3_stmt结构表示一个单独的SQL语句。

int rc = sqlite3_open(":memory:", &db);

sqlite3_open()函数打开一个新的数据库连接。它的参数是数据库名称和数据库句柄。

这个 :memory: 是一个特殊的数据库名称,使用它可以打开内存数据库。

该函数的返回码指示数据库是否成功打开。连接成功建立时返回SQLITE_OK。

if (rc != SQLITE_OK) {
    
    fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    
    return 1;
}

如果返回代码指示错误,我们将消息打印到控制台,关闭数据库句柄,并终止程序。sqlite3_errmsg()函数返回错误的描述。无论打开时是否发生错误,都应通过将数据库连接句柄传递给sqlite3_close()函数来释放与数据库连接句柄关联的资源。

rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0);

在执行SQL语句之前,必须首先使用sqlite3_prepare *函数之一将其编译为字节码。(不推荐使用sqlite3_prepare()函数)。

sqlite3_prepare_v2()函数有五个参数:

成功时,sqlite3_prepare_v2()返回SQLITE_OK;否则返回错误代码。

if (rc != SQLITE_OK) {
    
    fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    
    return 1;
}

这是sqlite3_prepare_v2()函数调用的错误处理代码。

rc = sqlite3_step(res);

sqlite3_step()运行SQL语句。 SQLITE_ROW返回码表示还有另一行准备好。我们的SQL语句只返回一行数据,所以我们只调用一次这个函数。

sqlite3_finalize(res);

sqlite3_finalize()函数销毁准备好的语句对象。

sqlite3_close(db);

sqlite3_close()函数关闭数据库连接。