您的位置:首页 > 编程语言 > C语言/C++

C++操作SQLite数据库

2014-05-15 10:30 429 查看


准备工作

在使用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)
02
{
03
int
len
=MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0);
04
wchar_t
*
wstr=
new
wchar_t
[len+1];
05
memset
(wstr,
0,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];
09
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的转换

01
<span
style=
"font-size:18px;"
>
char
*
G2U(
const
char
*
gb2312)
02
{
03
int
len
=MultiByteToWideChar(CP_ACP,0,gb2312,-1,NULL,0);
04
wchar_t
*
wstr=
new
wchar_t
[len+1];
05
memset
(wstr,
0,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];
09
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类头文件如下

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_
03
04
#if
_MSC_VER>1000
05
#pragma
once
06
#endif
//_MSC_VER>1000
07
#include
"sqlite3.h"
08
#include
<windows.h>
09
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_)</windows.h></span>
源文件如下

01
<span
style=
"font-size:18px;"
>#include
"SQLiteHelper.h"
02
#include
<iostream.h>
03
04
//////////////////////////////////////////////////////////////////////
05
//
Construction/Destruction
06
//////////////////////////////////////////////////////////////////////
07
08
SQLiteHelper::SQLiteHelper()
09
{
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;
span=
""
}<=
""
sqlite3_close(db);=
""
{=
""
sqlitehelper::closedb()=
""
void
=
""
}=
""
postquitmessage(0);=
""
return
;=
""
></endl;></iostream.h></span>
我的主函数类如下

01
<span
style=
"font-size:18px;"
>include
<iostream.h>
02
#include
<windows.h>
03
#include
"sqlite3.h"
04
#include
"SQLiteHelper.h"
05
#pragma
comment(lib,"sqlite3.lib")
06
//utf-8转换到GB3212
07
char
*
U2G(
const
char
*
utf8)
08
{
09
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
intodotavalues(6,'zhycheng')"
;
43
help->execSQL(sql);
44
char
*sql2=
"select
*fromdota"
;
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;
help-=
""
>closeDB();
51
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: