zoukankan      html  css  js  c++  java
  • [原]SQLite的学习系列之获取数据库版本二

    本系列文章主要是使用C++语言来调用其API,达到管中窥豹的目的。另外本文使用的开发环境为mac + clion,并且基于SQLite 3.7.14来进行开发.

      一、去下载sqlite-amalgamation-3071400.zip,然后解压到文件夹(其结构目录树如下):

        .

        ├── shell.c

        ├── sqlite3.c

        ├── sqlite3.h

        └── sqlite3ext.h

     

      二、新建一个sql_tutorial的工程,景sqlite3.c和sqlite3.h文件拷贝到sql_src目录下:

        .

        ├── main.cpp

        └── sql_src

            ├── sqlite3.c

            └── sqlite3.h

     

      

      三、在main.cpp中调用sqlite的代码如下:

        

    /**
     * We get the version of the SQLite database. This time we will use an SQL query.
     */
    #include <iostream>
    #include "./sql_src/sqlite3.h"
    
    using namespace std;
    
    int main() {
        sqlite3 *db;
        sqlite3_stmt *res;
    
        const char *file = "test.db";
        int rc = sqlite3_open(file, &db);
    
        if (rc != SQLITE_OK) {
            cout << "Cannot open database: " << sqlite3_errmsg(db) << endl;
            sqlite3_close(db);
    
            exit(1);
        }
    
        rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0);
        if (rc != SQLITE_OK) {
            cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl;
            sqlite3_close(db);
            exit(1);
        }
    
        rc = sqlite3_step(res);
    
        if (rc == SQLITE_ROW) {
            cout << sqlite3_column_text(res, 0) << endl;
        }
    
        sqlite3_finalize(res);
        sqlite3_close(db);
        return 0;
    }

      四、最后的运行结果如下:

      

    3.7.14
    
    Process finished with exit code 0

      

      调用分析:

    sqlite3 *db;

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

    sqlite3_stmt *res;

      2、该sqlite3_stmt结构代表一个SQL语句。

    int rc = sqlite3_open(file, &db);

      3、该sqlite3_open()函数打开一个新的数据库连接。其参数是数据库名称和数据库句柄。在“test.db的”是采用了特殊的数据库名称导致打开一个内存数据库。函数的返回码指示数据库是否被成功打开。当连接成功建立,则返回SQLITE_OK。

    if (rc != SQLITE_OK) {
            cout << "Cannot open database: " << sqlite3_errmsg(db) << endl;
            sqlite3_close(db);
    
            exit(1);
        }

      4、如果返回代码指示错误,我们打印邮件到控制台,关闭数据库处理,并终止该计划。该sqlite3_errmsg()函数返回错误的描述。它是否被打开时发生错误,与数据库连接句柄相关联的资源,应通过使其向sqlite3_close()函数释放。

    rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0);
        if (rc != SQLITE_OK) {
            cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl;
            sqlite3_close(db);
            exit(1);
        }

      5、执行SQL语句之前,必须调用首先被编译成字节代码的sqlite3_prepare功能之一。 (该sqlite3_prepare()函数被弃用。)

      sqlite3_prepare_v2()函数有五个参数。

      第一个参数是从所述sqlite3_open()函数获得的数据库句柄。

      第二个参数是要编译的SQL语句。

      第三个参数为以字节为单位的SQL语句的最大长度。传递-1会导致读取SQL字符串到第一个零终止子字符串结束了。根据该文件,可以通过传递提供的SQL字符串的字节的确切数量获得一些小的性能优势。

      第四个参数是语句句柄。这将指向预编译的语句,如果sqlite3_prepare_v2()成功运行

      最后一个参数是一个指向SQL语句的未使用的部分。只有SQL字符串的第一个语句被编译,所以参数指向剩下什么未编译。我们传入0,因为该参数对我们不是很重要。

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

      

    rc = sqlite3_step(res);

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

      

    sqlite3_finalize(res);

      7、该sqlite3_finalize()函数销毁准备语句对象。

    sqlite3_close(db);

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

      

     

  • 相关阅读:
    Windows配置深度学习环境详细教程(二):conda工具的使用
    Windows配置深度学习环境详细教程(一):安装Pycharm和Miniconda
    性能基准DevOps之如何提升脚本执行效率
    【Go语言绘图】图片添加文字(二)
    Cesium中用到的图形技术——Computing the horizon occlusion point
    Cesium中用到的图形技术——Horizon Culling
    Unity3D学习笔记3——Unity Shader的初步使用
    C++:异常处理
    mysql数据库备份
    编程小工具
  • 原文地址:https://www.cnblogs.com/tanlon/p/5482220.html
Copyright © 2011-2022 走看看