C++操作SQLite数据库

准备工作

在使用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
 
 1 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 }

GB2312到UTF-8的转换

 1 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 }
这两个函数会用就行,需要引入windows.h头文件

我做的一个实战工程

在我的工程中,我将API封装了一下,便于操作。
我新建了一个叫做SQLiteHelper类  头文件如下
#if !defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)  
#define AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_  
  
#if _MSC_VER > 1000  
#pragma once  
#endif // _MSC_VER > 1000  
#include "sqlite3.h"  
#include <windows.h>  
class SQLiteHelper    
{  
public:  
    SQLiteHelper();  
    virtual ~SQLiteHelper();  
    sqlite3 *db;  
    void execSQL(char *sql);  
    char**rawQuery(char *sql,int *row,int *column,char **result);  
    void openDB(char *path);  
    void closeDB();  
  
      
      
  
  
};  
  
#endif // !defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_) 

源文件如下

 1 #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 }  

我的主函数类如下

 1 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 }

 

posted @ 2014-01-07 10:33  rshow  阅读(1773)  评论(0编辑  收藏  举报