• C++访问sqlite3的初体验


    Sqlite确实是一个比较好的本地数据库,从接触它的时候就喜欢上了它,它可以在很多情况下简化应用。不过以前都是在Java里面使用,或者Linux C下使用的,现在有个项目(C++)可能我会用到sqlite做数据持久化,所以先热热身。
     
    第一步:下载相关文件
    首先到这里下载sqlite-source-3_6_12.zip、sqlite-3_6_12.zip、 sqlitedll-3_6_12.zip三个包,并分别解压。
     
    第二步:生成SQLite的lib文件
    cmd进入命令行后输入: LIB /DEF:SQLITE3.DEF /MACHINE:IX86
    如果找不到命令LIB,则需要将Microsoft Visual StudioVC98Bin这个目录添加到环境变量里。这样就生成了sqlite3.lib文件,我们在后面需要用到这个库,用于链接win32程序
     
    第三步:编写测试工程
    新建项目,将sqlite3.h(在源码包里)、sqlite3.dll、sqlite3.lib设置到工程环境里,或者直接拷贝到工程目录下。
    然后我们将cmd切换到sqlite3的目录下,里面有个sqlite3.exe。执行命令:
    > sqlite3 D:sql.db ;生成sql.db的数据库文件
    sqlite3 > create table test_tab (f1 int, f2 long);
    sqlite3 > .q
    这样我们就生成了一张test_tab的表。
    然后编写如下代码:
    C++代码
    #include "sqlite3.h"
    #include <iostream>
    #include <sstream>
     
    using namespace std;
    sqlite3 * pDB;
    int createTable()
    {
    char* errMsg;
    std::string dropTab = "drop table test_tab;";
    string strSQL= "create table test_tab (f1 int, f2 long);";
     
    int res= sqlite3_exec(pDB , dropTab.c_str() , 0 , 0 , &errMsg);
     
    if (res != SQLITE_OK)
    {
    std::cout << "执行SQL 出错." << errMsg << std::endl;
    return -1;
    }
    res = sqlite3_exec(pDB , strSQL.c_str() ,0 ,0, &errMsg);
     
    if (res != SQLITE_OK)
    {
    std::cout << "执行创建table的SQL 出错." << errMsg << std::endl;
    return -1;
    }
    else
    {
    std::cout << "创建table的SQL成功执行."<< std::endl;
    }
     
    return 0;
    }
     
    int insert1()
    {
    char* errMsg;
     
    int res = sqlite3_exec(pDB,"begin transaction;",0,0, &errMsg);
     
    for (int i= 1; i < 10; ++i)
    {
    std::stringstream strsql;
    strsql << "insert into test_tab values(";
    strsql << i << ","<< (i+10) << ");";
    std::string str = strsql.str();
    res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
    if (res != SQLITE_OK)
    {
    std::cout << "执行SQL 出错." << errMsg << std::endl;
    return -1;
    }
    }
     
    res = sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);
     
    std::cout << "SQL成功执行."<< std::endl;
     
     
    return 0;
    }
     
    static int callback(void *NotUsed, int argc, char **argv, char **azColName)
    {
     
    for(int i = 0 ; i < argc ; i++)
    {
    std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << ", " ;
    }
     
    std::cout<< " ";
    return 0;
    }
     
    int select1()
    {
    char* errMsg;
    string strSQL= "select * from test_tab;";
     
    int res = sqlite3_exec(pDB, strSQL.c_str(), callback , 0 , &errMsg);
     
    if (res != SQLITE_OK)
    {
    std::cout << "执行SQL 出错." << errMsg << std::endl;
    return -1;
    }
    else
    {
    std::cout << "SQL成功执行."<< std::endl;
    }
     
    return 0;
    }
     
    int main()
    {
    int res = sqlite3_open("D:\sql.db", &pDB);
     
    if( res ){
    std::cout << "Can't open database: "<< sqlite3_errmsg(pDB);
    sqlite3_close(pDB);
    return -1;
    }
    res = createTable();
    if (res != 0)
    {
    return 0;
    }
    res = insert1();
    if (res != 0)
    {
    return 0;
    }
    select1();
     
    return 0;
    }
     
    编译、链接、执行,看看效果吧。
    SQLite不愧是数据存储的 "瑞士军刀".不像使用某些数据库,要配置ODBC,还要把一大堆的dll一起打包到最终的用户程序中去.还得使用depends之类的工具看要打包哪些.dll.
    更多学习参看sqlite提供的document啦```
     
  • 相关阅读:
    Windows 7 x64环境下SDK Manager闪退的解决方法
    Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
    【智能家居篇】wifi网络结构(下)
    mac 查看python路径
    制作NGUI动态字体
    Mac OS 10.10.3下Apache + mod_wsgi配置【一】
    归档日志
    Cocos2D-X2.2.3学习笔记12(瞬时动作)
    合并两个已经排好序的不等长的数组
    JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中
  • 原文地址:https://www.cnblogs.com/blogpro/p/11426795.html
Copyright © 2020-2023  润新知