zoukankan      html  css  js  c++  java
  • [转]c++ 开发 sqlite

    #include <iostream>
    #include <sqlite3.h>
    using namespace std;
    
    int main()
    {
        cout << "Hello World!" << endl;
        sqlite3 *sql = NULL; // 一个打开的数据库实例
            const char * path = "/home/gaoyuan/temp/test.db";//某个sql文件的路径
    
            // 根据文件路径打开数据库连接。如果数据库不存在,则创建。
            // 数据库文件的路径必须以C字符串传入。
            int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL);
    
            if (result == SQLITE_OK) {
                std::clog << "打开数据库连接成功";
            }
            else {
                std::clog << "打开数据库连接失败";
            }
    
        return 0;
    }

     打开或者创建数据库

    const char *sqlSentence = "INSERT INTO t_person(name, age) VALUES('夏明', 22); ";        //SQL语句
        sqlite3_stmt *stmt = NULL;        //stmt语句句柄
    
        //进行插入前的准备工作——检查语句合法性
        //-1代表系统会自动计算SQL语句的长度
        int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
    
        if (result == SQLITE_OK) {
            std::clog<< "添加数据语句OK";
            //执行该语句
            sqlite3_step(stmt);
        }
        else {
            std::clog << "添加数据语句有问题";
        }
        //清理语句句柄,准备执行下一个语句
        sqlite3_finalize(stmt);

    执行不返回数据的SQL语句(增、删、改)。

    执行更新、删除语句和执行创表、添加语句基本类似,只需更改sql语句即可。)

    const char *sqlSentence = "SELECT name, age FROM t_person WHERE age < 30;";    //SQL语句
        sqlite3_stmt *stmt = NULL;    // stmt语句句柄
    
        //进行查询前的准备工作——检查语句合法性
        //-1代表系统会自动计算SQL语句的长度
        int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
    
        if (result == SQLITE_OK) {
            std::clog <<  "查询语句OK";
                // 每调一次sqlite3_step()函数,stmt语句句柄就会指向下一条记录
                while (sqlite3_step(stmt) == SQLITE_ROW) {
                    // 取出第0列字段的值
                    const unsigned char *name = sqlite3_column_text(stmt, 0);
                    // 取出第1列字段的值
                    int age = sqlite3_column_int(stmt, 1);
                    //输出相关查询的数据
                    std::clog << "name = " << name <<", age = "<< age;
                }
        }
        else {
            std::clog << "查询语句有问题";
        }
        //清理语句句柄,准备执行下一个语句
        sqlite3_finalize(stmt);

    执行返回数据的SQL语句(查)。

    if (sql) {
            sqlite3_close_v2(sql);
            sql = nullptr;
     }

    关闭数据库:sqlite3_close_v2(sqlite3* sql)

    SQLite3 库函数 总结

    1.打开数据库

    int sqlite3_open_v2(
    const char *filename,   // 数据库的文件路径
    sqlite3 **ppDb,       // 数据库实例
    int flags,          // 标志
    const char *zVfs      // 使用该数据库的虚拟机的名字,这里我们不需要用,直接NULL
    );

    其中:

     flags参数有如下标志:
    SQLITE_OPEN_NOMUTEX: 设置数据库连接运行在多线程模式(没有指定单线程模式的情况下)
    SQLITE_OPEN_FULLMUTEX:设置数据库连接运行在串行模式。
    SQLITE_OPEN_SHAREDCACHE:设置运行在共享缓存模式。
    SQLITE_OPEN_PRIVATECACHE:设置运行在非共享缓存模式。
    SQLITE_OPEN_READWRITE:指定数据库连接可以读写。
    SQLITE_OPEN_CREATE:如果数据库不存在,则创建。

    2.检查SQL语句的合法性(查询前的准备)

    若语句合法即编译通过,则将语句产生的指令塞进stmt句柄(此时并未执行指令)

    复制代码
    int sqlite3_prepare_v2(
        sqlite3 *db,                                    // 数据库实例
        const char *zSql,                               // 需要检查的SQL语句
        int nByte,                                      // SQL语句的最大字节长度
        sqlite3_stmt **ppStmt,                          // stmt句柄,用来存储SQL stmt指令
        const char **pzTail
    );
    复制代码

    3.执行stmt句柄(执行存储在stmt句柄的指令

    如果指令能查询到下一行数据,就会返回SQLITE_ROW

    如果指令(例如写入数据)不需要返还数据,就会返还SQLITE_DONE

    int sqlite3_step(
      sqlite3_stmt* stmt    //stmt句柄
     ); 

    4.利用stmt句柄获得第iCol字段的值(字段的下标从0开始)

    //执行完查询句柄后,stmt就会指向查到的数据

    //然后可以通过stmt获取相应数据

    double sqlite3_column_double(sqlite3_stmt*, int iCol);                  // 浮点数据
    int sqlite3_column_int(sqlite3_stmt*, int iCol);                        // 整型数据
    sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);            // 长整型数据
    const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);               // 二进制文本数据
    const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);      // 字符串数据

    其他:

    清理语句句柄(以便重复使用同一个stmt句柄)

    int sqlite3_finalize(
      sqlite_stmt* stmt      //stmt句柄
    );

    关闭数据库连接

    int sqlite3_close_v2(
      sqlite3 * sql,            // 数据库实例
    );

    直接编译并执行 SQL语句

    (不推荐使用:1、没有SQL语法检查 2、每一句SQL语句即使完全一样,也会重新编译执行,对批量指令来说效率不高。)

    复制代码
    int sqlite3_exec(
        sqlite3* sql,                             // 一个打开的数据库实例 
        const char * sqlSentence,                 // 需要执行的SQL语句
        int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调
        void *,                                   // 回调函数的第1个参数
        char **errmsg                             // 错误信息
    );
    复制代码

    |额外:使用SQLiteStudio工具来辅佐

    SQLiteStudio是一个可视化的数据库管理工具。

    通过可视化界面,它可以方便快捷地查看或操作数据库信息。

    它是程序sqlite数据调试检查不可或缺的辅助工具。

    (界面大概如图:)

    SQLiteStudio 下载地址:https://sqlitestudio.pl/index.rvt?act=download

  • 相关阅读:
    vs2010 + .net3.5 MSCharts使用介绍与例子
    TFS服务连接TF31002 出错
    SharePoint CAML 通过时间查询
    SharePoint2010项目总结汇总
    jquery 获取和设置 select下拉框的值
    How to Create Multilingual Webpart in SharePoint 2010 (C# 方式)
    sharepoint母版页固定宽度与纵向滚动条靠右边(修改版)
    JavaScript进行GET和POST请求
    端口简介大全
    程序员学习能力提升三要素
  • 原文地址:https://www.cnblogs.com/lyggqm/p/11443256.html
Copyright © 2011-2022 走看看