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
char* U2G(const char* utf8)
{
 int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
 len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}
GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
 int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
 len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}
这两个函数会用就行,需要引入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 
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_)

源文件如下
#include "SQLiteHelper.h"
#include 
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
SQLiteHelper::SQLiteHelper()
{
}
SQLiteHelper::~SQLiteHelper()
{
}
void SQLiteHelper::execSQL(char *sql)
{
	sqlite3_exec(db,sql,0,0,0);
}
char **SQLiteHelper::rawQuery(char *sql,int *row,int *column,char **result)
{
	sqlite3_get_table(db,sql,&result,row,column,0);
	return result;
}
void SQLiteHelper::openDB(char *path)
{
	int last=sqlite3_open(path,&db);
	if(SQLITE_OK!=last)
	{
cout<<"打开数据库出错"<

我的主函数类如下
include 
#include 
#include "sqlite3.h"
#include "SQLiteHelper.h"
#pragma comment(lib,"sqlite3.lib")
//utf-8转换到GB3212
char* U2G(const char* utf8)
{
 int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
 len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}
//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
 int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
 wchar_t* wstr = new wchar_t[len+1];
 memset(wstr, 0, len+1);
 MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
 len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
 char* str = new char[len+1];
 memset(str, 0, len+1);
 WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
 if(wstr) delete[] wstr;
 return str;
}
void main()
{
SQLiteHelper *help=new SQLiteHelper();
	help->openDB("d:\\zhycheng.db3");
	char *sql="insert into dota values(6,'zhycheng')";
	help->execSQL(sql);
	char *sql2="select * from dota";
	int row,col;
	char *eee="i";
	char **result=&eee;
	char **re=help->rawQuery(sql2,&row,&col,result);
	char *ll=U2G(re[(2+1)*col+1]);
	cout<closeDB();
}
这里我讲解一下re[(2+1)*col+1] re是指向数组的指针。(2+1)为第3行,1表示第2列。 C++操作SQLite数据库
从中可以看出,我将“张译成”这个字符串读出了。大家注意,在写入的时候,如果要写入中文的话,就要将中文从GB2312转换到utf-8再写入,大家根据自己项目的需要,函数我已经给出了。
来自:http://blog.csdn.net/zhy_cheng/article/details/7667734
昵    称:
验证码:

相关文档:

  • C++代码生成器:xsd2cc
    Xsd2cc是一个霸气的C++代码生成器,直接从指定的XML数据格式定义文件(.xsd)生成对应的C++类代码,然后将这些代码和xsd2cc库结合(自带...
  • 通用LINUX C类库 jzlibs
    通用LINUX C类库。 包含双向链表、单向链表、向量、哈希表、红黑树等经典数据结构及其算法...
  • 底层的 C 程序库 skalibs
    skalibs 是一组用于一般用途的、底层的 C 程序库,可替换标准 C 库的一些方法,主要用于构建很小的静态二进制文件。...
  • Pelles C - 免费的C语言开发工具
    Pelles C是一款windows下的C IDE,支持调试,且为免费。...
  • C++集成开发环境 Code::Blocks
    Code::Blocks (codeblocks)是一个开源、免费、跨平台的c++ IDE。官方网站上称其能满足最苛刻的用户的需求。虽有点夸张,但既然敢这样说,也...
  • SolarAndLunar - 实现农历和公历的互转功能
    SolarAndLunar 是一个 C 语言的开发包,用来实现农历和公历的互转功能。...
  • VS2013中的C++11新特性
    Visual C++ 2013 Preview 在6月发布了,C++开发者又找到一个编译器可以更好的支持ISO C++ 11 的特性了.本文介绍了这些新的特性并附有代码实例....
  • wxWidgets对话框设计器 wxDev-C++
    wxDev-C++是一个 Dev-C++的扩展由科林拉普拉斯等开发。 该软件可以帮助您在创建和框架的对话框使用wxWidgets的形式直观地设计。 随Dev-C++的...
  • Windows下用Eclipse搭建C/C++开发环境
    Windows下C/C++的IDE有很多,要学习Eclipse,所以就选下面要讲的Eclipse + GNU toolchain(话说toolchain这个词很形象)....
  • hashmap的C语言实现
    hashmap的C语言实现...
  • C语言哈希表 uthash
    uthash 是一个C语言的哈希表,支持各种结构类型的存储、添加、删除,这些操作都在固定的时间完成,跟哈希表本身的大小无关。键也可...
  • C语言的SPDY开发包 libspdy
    libspdy 是 C 语言实现对 SPDY 协议支持的库。只需依赖 zlib 包...
  • 小型的GNU环境 MSys
    MSYS:Minimal GNU(POSIX)system on Windows,是一个小型的GNU环境,包括基本的bash,make等等。是Windows下最优秀的GNU环境。(是否厌倦了Cygwin蜗...
  • C语言的hash表实现:uthash
    uthash是一个C语言的hash表实现。它以宏定义的方式实现hash表,不仅加快了运行的速度,而且与关键类型无关的优点。 uthash使用起来十...
  • 非常精简的开源 C 协程库:Protothreads
    开源 C 协程库 protothreads。这是一个全部用 ANSI C 写成的库,之所以称为“蝇量级”的,就是说,实现已经不能再精简了,几乎就是原语级...
  • C++模板库 libsigc++
    libsigc++是实现类型安全回调的一个C++模板库。...
  • 用C++简单封装了一下SQLite
    SQLite 强大,大家都知道,但是原生是C接口,用来其应用层稍微麻烦些。 今天做了个简单的C++封装,使用面向对象的方法来使用。...
  • 单位转换测量 GNU Units
    GNU 单位转换测量到其等值的其他测量系统的各种系统中表达量。像许多类似的方案,它可以处理乘法规模的变化。...
  • ANSI C实现的基础库:cfan
    cfan是开源的ANSI C实现的基础库。讲究代码整洁,性能和跨平台。...
  • 基于Udp的Socket网络编程聊天程序
    基于Udp的Socket网络编程聊天程序...