准备工作
在使用C++操作SQLite之前,需要获得sqlite3.h,sqlite3.lib,sqlite3.dll,大家可以在
这里下载。并将这3个文件导入VC++工程中。其中sqlite3.dll文件放到Debug文件夹里。
SQLiteAPI介绍
intsqlite3_open(char*path,sqlite3**db)
这个函数打开数据库,第一个参数为sqlite文件的地址,第二个参数是sqlite3的指针的指针,也就是二级指针。
返回值为SQLITE_OK则成功打开数据库。
sqlite3_close(sqlite3*db)
这个函数关闭数据库,参数是sqlite3的指针。
sqlite3_exec(sqlite3*db,char*sql,intl,intm,intn)
这个函数执行SQL语句,如果我们不需要返回的结果就用这个函数执行SQL语句。第一个参数是sqlite3的指针,第二个参数为执行的SQL语句,后面3个参数我们不用关心,都设为0。
sqlite3_get_table(sqlite*db,char*sql,char***result,int*row,int*column,intk);
这个函数执行查询语句,返回我们所需要的信息。第一个参数是sqlite的指针,第二个参数是SQL语句,第三个参数是返回的信息。row是返回的行数,column是返回的列数,最后一个参数设为0就行了。
因为我们使用的是GB2312,而SQLite使用的是utf-8,所以在使用中会出现中文乱码,为了解决这个问题,我介绍两个有用的函数
utf-8转换到GB3212
01 | <span
style= "font-size:18px;" > char *
U2G( const char *
utf8) |
03 | int len =MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0); |
04 | wchar_t * wstr= new wchar_t [len+1]; |
06 | MultiByteToWideChar(CP_UTF8, 0,utf8,-1,wstr,len); |
07 | len =WideCharToMultiByte(CP_ACP,0,wstr,-1,NULL,0,NULL,NULL); |
08 | char * str= new char [len+1]; |
10 | WideCharToMultiByte(CP_ACP, 0,wstr,-1,str,len,NULL,NULL); |
GB2312到UTF-8的转换
01 | <span
style= "font-size:18px;" > char *
G2U( const char *
gb2312) |
03 | int len =MultiByteToWideChar(CP_ACP,0,gb2312,-1,NULL,0); |
04 | wchar_t * wstr= new wchar_t [len+1]; |
06 | MultiByteToWideChar(CP_ACP, 0,gb2312,-1,wstr,len); |
07 | len =WideCharToMultiByte(CP_UTF8,0,wstr,-1,NULL,0,NULL,NULL); |
08 | char * str= new char [len+1]; |
10 | WideCharToMultiByte(CP_UTF8, 0,wstr,-1,str,len,NULL,NULL); |
这两个函数会用就行,需要引入windows.h头文件
我做的一个实战工程
在我的工程中,我将API封装了一下,便于操作。
我新建了一个叫做SQLiteHelper类头文件如下
01 | <span
style= "font-size:18px;" ># if !defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_) |
02 | #define
AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_ |
13 | virtual ~SQLiteHelper(); |
16 | char **rawQuery( char *sql, int *row, int *column, char **result); |
26 | #endif //!defined(AFX_SQLITEHELPER_H__59F8C44E_0D98_4422_AEB1_2FD927EE8902__INCLUDED_)</windows.h></span> |
源文件如下
01 | <span
style= "font-size:18px;" >#include "SQLiteHelper.h" |
04 | ////////////////////////////////////////////////////////////////////// |
05 | //
Construction/Destruction |
06 | ////////////////////////////////////////////////////////////////////// |
08 | SQLiteHelper::SQLiteHelper() |
13 | SQLiteHelper::~SQLiteHelper() |
17 | void SQLiteHelper::execSQL( char *sql) |
19 | sqlite3_exec(db,sql,0,0,0); |
21 | char **SQLiteHelper::rawQuery( char *sql, int *row, int *column, char **result) |
23 | sqlite3_get_table(db,sql,&result,row,column,0); |
26 | void SQLiteHelper::openDB( char *path) |
28 | int last=sqlite3_open(path,&db); |
31 | cout<< "打开数据库出错" <<endl;
span= "" }<= "" sqlite3_close(db);= "" {= "" sqlitehelper::closedb()= "" void = "" }= "" postquitmessage(0);= "" return ;= "" ></endl;></iostream.h></span> |
我的主函数类如下
01 | <span
style= "font-size:18px;" >include
<iostream.h> |
04 | #include
"SQLiteHelper.h" |
05 | #pragma
comment(lib,"sqlite3.lib") |
07 | char *
U2G( const char *
utf8) |
09 | int len =MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0); |
10 | wchar_t * wstr= new wchar_t [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]; |
16 | WideCharToMultiByte(CP_ACP, 0,wstr,-1,str,len,NULL,NULL); |
21 | char *
G2U( const char *
gb2312) |
23 | int len =MultiByteToWideChar(CP_ACP,0,gb2312,-1,NULL,0); |
24 | wchar_t * wstr= new wchar_t [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]; |
30 | WideCharToMultiByte(CP_UTF8, 0,wstr,-1,str,len,NULL,NULL); |
40 | SQLiteHelper
*help= new SQLiteHelper(); |
41 | help->openDB( "d:\\zhycheng.db3" ); |
42 | char *sql= "insert intodotavalues(6,'zhycheng')" ; |
44 | char *sql2= "select *fromdota" ; |
48 | char **re=help->rawQuery(sql2,&row,&col,result); |
49 | char *ll=U2G(re[(2+1)*col+1]); |
50 | cout<<ll<<endl;
help-= "" >closeDB(); |
52 | }</ll<<endl;></windows.h></iostream.h></span> |
这里我讲解一下re[(2+1)*col+1]
re是指向数组的指针。(2+1)为第3行,1表示第2列。
从中可以看出,我将“张译成”这个字符串读出了。大家注意,在写入的时候,如果要写入中文的话,就要将中文从GB2312转换到utf-8再写入,大家根据自己项目的需要,函数我已经给出了。
来自:http://blog.csdn.net/zhy_cheng/article/details/7667734