C++操作SQLite数据库

来源:互联网 发布:动漫设计软件下载 编辑:程序博客网 时间:2024/05/04 21:04

转自:http://blog.csdn.net/zhy_cheng/article/details/7667734#

准备工作

在使用C++操作SQLite之前,需要获得sqlite3.h,sqlite3.lib,sqlite3.dll,大家可以在这里下载。并将这3个文件导入VC++工程中。其中sqlite3.dll文件放到Debug文件夹里。

SQLite API介绍

int sqlite3_open(char *path,sqlite3 **db)
这个函数打开数据库,第一个参数为sqlite文件的地址,第二个参数是sqlite3的指针的指针,也就是二级指针。
返回值为SQLITE_OK则成功打开数据库。

sqlite3_close(sqlite3 *db)
这个函数关闭数据库,参数是sqlite3的指针。

sqlite3_exec(sqlite3 *db,char *sql,int l,int m,int n)
这个函数执行SQL语句,如果我们不需要返回的结果就用这个函数执行SQL语句。第一个参数是sqlite3的指针,第二个参数为执行的SQL语句,后面3个参数我们不用关心,都设为0。

sqlite3_get_table(sqlite *db,char *sql,char ***result,int *row,int *column,int k);
这个函数执行查询语句,返回我们所需要的信息。第一个参数是sqlite的指针,第二个参数是SQL语句,第三个参数是返回的信息。row是返回的行数,column是返回的列数,最后一个参数设为0就行了。

因为我们使用的是GB2312,而SQLite使用的是utf-8,所以在使用中会出现中文乱码,为了解决这个问题,我介绍两个有用的函数
utf-8转换到GB3212
[cpp] view plaincopy
  1. <span style="font-size:18px;">char* U2G(const char* utf8)  
  2. {  
  3.  int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);  
  4.  wchar_t* wstr = new wchar_t[len+1];  
  5.  memset(wstr, 0, len+1);  
  6.  MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);  
  7.  len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);  
  8.  char* str = new char[len+1];  
  9.  memset(str, 0, len+1);  
  10.  WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);  
  11.  if(wstr) delete[] wstr;  
  12.  return str;  
  13. }</span>  
GB2312到UTF-8的转换
[cpp] view plaincopy
  1. <span style="font-size:18px;">char* G2U(const char* gb2312)  
  2. {  
  3.  int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);  
  4.  wchar_t* wstr = new wchar_t[len+1];  
  5.  memset(wstr, 0, len+1);  
  6.  MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);  
  7.  len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);  
  8.  char* str = new char[len+1];  
  9.  memset(str, 0, len+1);  
  10.  WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);  
  11.  if(wstr) delete[] wstr;  
  12.  return str;  
  13. }</span>  
这两个函数会用就行,需要引入windows.h头文件

我做的一个实战工程

在我的工程中,我将API封装了一下,便于操作。
我新建了一个叫做SQLiteHelper类  头文件如下
[cpp] view plaincopy
  1. <span style="font-size:18px;">#if !defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)  
  2. #define AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_  
  3.   
  4. #if _MSC_VER > 1000  
  5. #pragma once  
  6. #endif // _MSC_VER > 1000  
  7. #include "sqlite3.h"  
  8. #include <windows.h>  
  9. class SQLiteHelper    
  10. {  
  11. public:  
  12.     SQLiteHelper();  
  13.     virtual ~SQLiteHelper();  
  14.     sqlite3 *db;  
  15.     void execSQL(char *sql);  
  16.     char**rawQuery(char *sql,int *row,int *column,char **result);  
  17.     void openDB(char *path);  
  18.     void closeDB();  
  19.   
  20.       
  21.       
  22.   
  23.   
  24. };  
  25.   
  26. #endif // !defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)  
  27. </span>  

源文件如下
[cpp] view plaincopy
  1. <span style="font-size:18px;">#include "SQLiteHelper.h"  
  2. #include <iostream.h>  
  3.   
  4. //////////////////////////////////////////////////////////////////////  
  5. // Construction/Destruction  
  6. //////////////////////////////////////////////////////////////////////  
  7.   
  8. SQLiteHelper::SQLiteHelper()  
  9. {  
  10.       
  11. }  
  12.   
  13. SQLiteHelper::~SQLiteHelper()  
  14. {  
  15.   
  16. }  
  17. void SQLiteHelper::execSQL(char *sql)  
  18. {  
  19.     sqlite3_exec(db,sql,0,0,0);  
  20. }  
  21. char **SQLiteHelper::rawQuery(char *sql,int *row,int *column,char **result)  
  22. {  
  23.     sqlite3_get_table(db,sql,&result,row,column,0);  
  24.     return result;  
  25. }  
  26. void SQLiteHelper::openDB(char *path)  
  27. {  
  28.     int last=sqlite3_open(path,&db);  
  29.     if(SQLITE_OK!=last)  
  30.     {  
  31.         cout<<"打开数据库出错"<<endl;  
  32.         return;  
  33.         PostQuitMessage(0);  
  34.     }  
  35. }  
  36. void SQLiteHelper::closeDB()  
  37. {  
  38.     sqlite3_close(db);  
  39. }  
  40. </span>  

我的主函数类如下
[cpp] view plaincopy
  1. <span style="font-size:18px;">include <iostream.h>  
  2. #include <windows.h>  
  3. #include "sqlite3.h"  
  4. #include "SQLiteHelper.h"  
  5. #pragma comment(lib,"sqlite3.lib")  
  6. //utf-8转换到GB3212  
  7. char* U2G(const char* utf8)  
  8. {  
  9.  int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);  
  10.  wchar_t* wstr = new wchar_t[len+1];  
  11.  memset(wstr, 0, len+1);  
  12.  MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);  
  13.  len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);  
  14.  char* str = new char[len+1];  
  15.  memset(str, 0, len+1);  
  16.  WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);  
  17.  if(wstr) delete[] wstr;  
  18.  return str;  
  19. }  
  20. //GB2312到UTF-8的转换  
  21. char* G2U(const char* gb2312)  
  22. {  
  23.  int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);  
  24.  wchar_t* wstr = new wchar_t[len+1];  
  25.  memset(wstr, 0, len+1);  
  26.  MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);  
  27.  len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);  
  28.  char* str = new char[len+1];  
  29.  memset(str, 0, len+1);  
  30.  WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);  
  31.  if(wstr) delete[] wstr;  
  32.  return str;  
  33. }  
  34.   
  35.   
  36.   
  37. void main()  
  38. {  
  39.   
  40.     SQLiteHelper *help=new SQLiteHelper();  
  41.     help->openDB("d:\\zhycheng.db3");  
  42.     char *sql="insert into dota values(6,'zhycheng')";  
  43.     help->execSQL(sql);  
  44.     char *sql2="select * from dota";  
  45.     int row,col;  
  46.     char *eee="i";  
  47.     char **result=&eee;  
  48.     char **re=help->rawQuery(sql2,&row,&col,result);  
  49.     char *ll=U2G(re[(2+1)*col+1]);  
  50.     cout<<ll<<endl;  
  51.     help->closeDB();  
  52.   
  53. }</span>  
0 0