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.


  • 相关阅读:
    软件的安全性应从哪几个方面去测试?
    目前主要的测试用例设计方法是什么?
    什么是软件质量?
    软件配置管理的作用?软件配置包括什么?
    什么是软件测试?软件测试的目的与原则
    软件生存周期及其模型是什么?
    软件的概念和特点?软件复用的含义?构件包括哪些?
    一台客户端有三百个客户与三百个客户端有三百个客户对服务器施压,有什么区别?
    在搜索引擎中输入汉字就可以解析到对应的域名,请问如何用LoadRunner进行测试。
    测试08
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3366057.html
Copyright © 2011-2022 走看看