zoukankan      html  css  js  c++  java
  • SQLite3与C++的结合应用

    SQLite并没有一次性做到位,只有下载这些东西是不能放在vs2010中并马上使用的,下载下来的文件中有sqlite3.c/h/dll/def,还是不够用的。我们需要的sqlite3.lib文件并不在其中,需要我们自己动手了。
    这儿要用到visual studio提供的Visual Studio Command Prompt工具了。打开之后,进入含有sqlite3.dll和sqlite3.def的目录下,输入以下命令:
    LIB /DEF:sqlite3.def /MACHINE:IX86
    就能生成sqlite3.exp和sqlite3.lib文件了,这样在工程中就可以加入lib文件进行编译了。
     
    SEC 1:
    因为只是演示API,所以这次在vs2010下建立一个空的win32工程SQLite3Test,在工程的属性-链接-输入中添加sqlite3.lib的引用。添加新的文件main.cpp,写一个main函数,并编译一下。
    好,接下来把sqlite3.h/def/exp/lib通通放进SQLite3TestSQLite3Test目录下,跟main.cpp在一起,如图:
     
     
    把sqlite3.dll跟生成的exe放在一起。
    SEC 2:
    接下来开始进行sqlite3的使用。引入sqlite3.h头文件,并写下如下代码:
    #include <iostream>
    #include "sqlite3.h"
     
    using namespace std;
     
    int main(int argc, char** argv)
    {
    sqlite3 * conn = NULL;
    char * err_msg = NULL;
    char sql[200] = "";
     
    // 打开数据库, 创建连接
    if(sqlite3_open("test.db", &conn) != SQLITE_OK)
    {
    printf("无法打开!");
    }
     
    // 关闭连接。
    if (sqlite3_close(conn) != SQLITE_OK)
    {
    printf("无法关闭,错误代码: %s ", sqlite3_errmsg(conn));
    exit(-1);
    }
     
    printf("操作成功! ");
     
    return 0;
    }
    sqlite3_open的函数原型如下:
    SQLITE_API int sqlite3_open(
    const char *filename, /* Database filename (UTF-8) */
    sqlite3 **ppDb /* OUT: SQLite db handle */
    );
    作用就不言而喻了,打开数据库。
    第一个参数是数据库文件的名称,如果没有,那就会自动创建一个。
    第二个参数是sqlite3的实例句柄的指针的指针。。(看到这儿我想起来,当时在linux下自己写mysql的C++api的时候,也是用的双重指针,搞死个人哟。。)
    常言道:“有打开,就有关闭!”,所以sqlite3_close()就起了这个作用。
    不过sqlite3_close的原型是这样的:
    SQLITE_API int sqlite3_close(sqlite3 *); //要格外注意双重指针和普通指针。。
    有了上面的万金油例子,想必已经对初始化有所了解了。运行后就在Debug目录下多了个test.db文件,不过大小为0KB,因为木有内容嘛!
     
    SEC 3:
    在数据库中创建表并插入数据。在open和close的之间写入如下代码:
    // 执行SQL
    sprintf(sql, "CREATE TABLE test_for_cpp
    (id int, name varchar(20), age int)");
    if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)
    {
    printf("操作失败,错误代码: %s", err_msg);
    exit(-1);
    }
     
    //添加10条记录
    for (int i = 0; i < 10; i++)
    {
    // 执行SQL
    sprintf(sql, "INSERT INTO test_for_cpp
    (id, name, age) VALUES
    (%d, '%s', %d)", i, "testPeople", i);
    if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK)
    {
    printf("操作失败,错误代码: %s", err_msg);
    exit(-1);
    }
    }
    sqlite3_exec的原型如下:
    SQLITE_API 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语句。
    第三个参数为回调函数的指针。因为这里只是创建表和插入数据,并没有数据返回,所以不需要填写回调函数。以NULL代替。
    第四个参数为回调函数所要使用的参数。同第三条。
    第五个参数为错误信息。
    这次再运行一下,就可以看到test.db已经不再是0KB了。
     
     
    SEC 4:
    再常言道:“有插入,就有读取!”下面来读取数据库文件中的数据。
    刚才提到了sqlite3_exec的回调函数,现在需要这个函数了。首先声明一个回调函数:
    int sqlite3_exec_callback(void *data, int nColumn,
    char **colValues, char **colNames);
    四个参数的类型不能变。
    然后写下该回调函数的实现:
    int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames)
    {
    for (int i = 0; i < nColumn; i++)
    {
    printf("%s ", colValues[i]);
    }
    printf(" ");
     
    return 0;
    }
    接下来在插入条目语句的后面写下下面的语句:
    // 查询
    sprintf(sql, "SELECT * FROM test_for_cpp");
    sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg);
    TIP: 前面创建表、插入数据的代码可以先注释掉,否则运行一次就会插入10条数据,会造成点困扰。
    运行就可以看到结果了:
     
     
    因为该回调函数每从数据库中取出一条数据就要调用一次,所以这是最耗时间的过程,这块代码应该尽量高效。
    这只是一个简单的例子,不过已经足够平时的小众软件使用了。一些高级的用法比如sqlite3_db_mutex(读写互斥锁)、sqlite3_backup_step(差异备份)等等,就可以看看sqlite3官方的教程了(猛戳传送)。
    作者:satanness
     
  • 相关阅读:
    c# 得到 XML的节点值和属性值
    jquery 更改超链接
    row_number()得到中间的信息
    UML系统分析与设计03-软件需求分析说明书
    UML系统分析与设计02-用例图和活动图(下)
    从Klocwork中.net检测项说说代码书写
    WCF之诡异通讯超时
    《Beginning WF : Windows Workflow in .NET 4.0》读书笔记
    UML系统分析与设计01-准备
    UML系统分析与设计02-用例图和活动图(上)
  • 原文地址:https://www.cnblogs.com/blogpro/p/11426878.html
Copyright © 2011-2022 走看看