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 }