zoukankan      html  css  js  c++  java
  • 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啦```
     
  • 相关阅读:
    mysql之指定为definer的用户不存在
    Hibernate报错:org.hibernate.ObjectNotFoundException: No row with the given identifier exists 解决办法
    MongoDB mongo.exe启动及闪退解决 转载
    pycharm下运行unittest的问题
    mysql大小写敏感与校对规则
    windows7环境下使用pip安装MySQLdb
    HTML中title前面小图标和网站收藏现实的图标
    异步发送的请求---取消操作
    视频文件上传遇到的问题
    vue-devtools 必备开发工具
  • 原文地址:https://www.cnblogs.com/blogpro/p/11426795.html
Copyright © 2011-2022 走看看