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程序 

    如果设置了环境变量,利用LIB仍不能编译成功,可把SQLITE3.DEF,sqlite3.dll拷贝到VS对应的Bin下,来执行Lib命令。我的开发环境是Win7 64,VS2010.

    在C:Program Files (x86)Microsoft Visual Studio 10.0VCinamd64 路径下lib成功。

    第三步:编写测试工程  
    新建项目,将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++代码   收藏代码
    1. #include "sqlite3.h"  
    2. #include <iostream>  
    3. #include <sstream>  
    4.   
    5. using namespace std;  
    6. sqlite3 * pDB;  
    7. int createTable()  
    8. {  
    9.     char* errMsg;  
    10.     std::string dropTab = "drop table test_tab;";  
    11.     string strSQL= "create table test_tab (f1 int, f2 long);";  
    12.    
    13.     int res= sqlite3_exec(pDB , dropTab.c_str() , 0 , 0 , &errMsg);  
    14.    
    15.     if (res != SQLITE_OK)  
    16.     {  
    17.         std::cout << "执行SQL 出错." << errMsg << std::endl;  
    18.         return -1;  
    19.     }  
    20.     res = sqlite3_exec(pDB , strSQL.c_str() ,0 ,0, &errMsg);  
    21.    
    22.     if (res != SQLITE_OK)  
    23.     {  
    24.         std::cout << "执行创建table的SQL 出错." << errMsg << std::endl;  
    25.         return -1;  
    26.     }  
    27.     else  
    28.     {  
    29.         std::cout << "创建table的SQL成功执行."<< std::endl;  
    30.     }  
    31.    
    32.     return 0;  
    33. }  
    34.    
    35. int insert1()  
    36. {  
    37.     char* errMsg;  
    38.    
    39.     int res = sqlite3_exec(pDB,"begin transaction;",0,0, &errMsg);  
    40.    
    41.     for (int i= 1; i < 10; ++i)  
    42.     {  
    43.         std::stringstream strsql;  
    44.         strsql << "insert into test_tab  values(";  
    45.         strsql  << i << ","<< (i+10) << ");";  
    46.         std::string str = strsql.str();  
    47.         res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);  
    48.         if (res != SQLITE_OK)  
    49.         {  
    50.             std::cout << "执行SQL 出错." << errMsg << std::endl;  
    51.             return -1;  
    52.         }  
    53.     }  
    54.    
    55.     res = sqlite3_exec(pDB,"commit transaction;",0,0, &errMsg);  
    56.    
    57.     std::cout << "SQL成功执行."<< std::endl;  
    58.    
    59.    
    60.     return 0;  
    61. }  
    62.    
    63. static int callback(void *NotUsed, int argc, char **argv, char **azColName)  
    64. {  
    65.      
    66.     for(int i = 0 ; i < argc ; i++)  
    67.     {  
    68.         std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << ", " ;  
    69.     }  
    70.    
    71.     std::cout<< " ";  
    72.     return 0;  
    73. }  
    74.    
    75. int select1()  
    76. {  
    77.     char* errMsg;  
    78.     string strSQL= "select * from test_tab;";  
    79.    
    80.     int res = sqlite3_exec(pDB, strSQL.c_str(), callback , 0 , &errMsg);  
    81.    
    82.     if (res != SQLITE_OK)  
    83.     {  
    84.         std::cout << "执行SQL 出错." << errMsg << std::endl;  
    85.         return -1;  
    86.     }  
    87.     else  
    88.     {  
    89.         std::cout << "SQL成功执行."<< std::endl;  
    90.     }  
    91.    
    92.     return 0;  
    93. }  
    94.    
    95. int main()  
    96. {  
    97.     int res = sqlite3_open("D:\sql.db", &pDB);  
    98.    
    99.     if( res ){  
    100.         std::cout << "Can't open database: "<< sqlite3_errmsg(pDB);  
    101.         sqlite3_close(pDB);  
    102.         return -1;  
    103.     }  
    104.     res = createTable();  
    105.     if (res != 0)  
    106.     {  
    107.         return 0;  
    108.     }  
    109.     res = insert1();  
    110.     if (res != 0)  
    111.     {  
    112.         return 0;  
    113.     }  
    114.     select1();  
    115.   
    116.     return 0;  
    117. }  


    编译、链接、执行,看看效果吧。 
    SQLite不愧是数据存储的 "瑞士军刀".不像使用某些数据库,要配置ODBC,还要把一大堆的dll一起打包到最终的用户程序中去.还得使用depends之类的工具看要打包哪些.dll. 

    更多学习参看sqlite提供的document啦```

    第四步,测试通过了,如果要应用的项目里,使用sqlite3提供的借口,不是很方便,需要再封装一层。推荐一个不错的 开源的wapper:SQLiteCpp.

    地址:https://github.com/SRombauts/SQLiteCpp

    SQLiteC++ (SQLiteCpp) is a smart and easy to use C++ SQLite3 wrapper.


  • 相关阅读:
    ubuntu20.04安装教程TLS,ubuntu安装教程20.04
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu20.04图文安装教程
    ubuntu20.04安装教程,ubuntu详细安装教程20.04
    ubuntu20.04安装教程,ubuntu安装教程20.04
    ubuntu19.10安装搜狗输入法,ubuntu19.10安装中文输入法
    ubuntu20.04安装搜狗输入法,ubunru安装搜狗输入法中文输入法拼音
    前端实现实时通讯
    移动端1px边框的实现
    利用js自动触发一个a标签的下载事件
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3366057.html
Copyright © 2011-2022 走看看