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 Studio\VC98\Bin这个目录添加到环境变量里。这样就生成了sqlite3.lib文件,我们在后面需要用到这个库,用于链接win32程序 

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

在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64 路径下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<< "\n";  
  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.


 

posted on 2013-10-12 22:20  新一  阅读(682)  评论(0编辑  收藏  举报

导航