第一步:准备工具。
1.1、准备Sqlite动态库,网上搜索会有下载,另外我在我的博客资源中也上传有,下载地址:https://download.csdn.net/download/cwj066/10647523
1.2、在Windows下安装vs2010,这个是必备工具,安装就不详细介绍,不懂的老铁可以去百度搜一下,有很多安装方法。
第二步:在vs2010配置Sqlite开发环境。
2.1 下载下来的Sqlite文件 把它解压出来,里面会有三个压缩文件和三个文档,有两个文档是介绍如何安装Sqlite,有一个文档“Sqlite增删改查语句.docx”是介绍Sqlite数据常用命令,另外三个压缩包分别是sqlite-amalgamation-3210000.zip、sqlite-dll-win32-x86-3210000.zip和Sqliteman-1.2.2.rar,其中sqlite-amalgamation-3210000.zip里面放的是Sqlite的接口文件(shell.c、sqlite3.c、sqlite3.h和sqlite3ext.h),sqlite-dll-win32-x86-3210000.zip里面放的是Sqlite的动态库文件(sqlite3.dll),而Sqliteman-1.2.2.rar里面放的是一个管理Sqlite数据库软件,在Windows下安装 了这个软件就可以打开Sqlite的数据库,也可以新建数据。
2.2 新建一个目录,我的目录名字叫LibSqLite,在这个目录再分别新建三个目录bin、include和lib。
把sqlite-amalgamation-3210000.zip里面的sqlite3.h和sqlite3ext.h拷贝到include目录
把sqlite-dll-win32-x86-3210000.zip里面的sqlite3.dll拷贝到bin目录,把sqlite3.lib拷贝到lib目录。
2.3 打开vs2010新一个名字为testSqlite的基于对话框的工程
2.4 项目---》属性
打开testSqlite的属性窗口,开始配置Sqlite的开发环境
2.4.1 配置属性---》VC++目录---》可执行文件目录:D:\w\mLib\LibSqLite\bin
2.4.2 配置属性---》VC++目录---》包含目录:D:\w\mLib\LibSqLite\include
2.4.3 配置属性---》VC++目录---》库目录:D:\w\mLib\LibSqLite\lib
到此SqLite的开发环境全部配置完成,接下来通过代码来展示,如何调用SqLite的接口来创建数据库、并调用SqLite的接口对数据库进行增、删、改、查等操作。一下是源码展示:
第三步:在vs2010上使用SqLite的接口函数。
3.1 用vs2010打开刚刚创建的testSqLite工程,把sqlite-amalgamation-3210000.zip里面的shell.c和sqlite3.c拷贝到当前工程的目录下,并把它们添加工程中。
展开testSelite---》源文件---》添加---》现有项
把它们添加到工程中来
3.2 在testSqliteDlg.h文件中引入sqlite3.h头文件
3.3 在testSqliteDlg.h文件中添加一个打开数据的函数OpenDatabase()和创建一个数据操作对象m_pDataBase,如果指定的数据库存在就打开它,否则就新建一个新的数据。
在testSqliteDlg.cpp文件写OpenDatabase的实现代码,并在OnInitDialog()函数中调用OpenDatabase()函数
/********************************************************
* 函数名称:OpenDatabase
* 函数功能:打开数据库,如果数据库不存在就创建数据库
* 输入参数: 无
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.05
* 作 者 : mark
********************************************************/
void CtestSqliteDlg::OpenDatabase()
{
char *errMsg = NULL;
int rc = 0;
//判断数据库是否存在,不存在就创建,存在就打开
if (PathFileExists(L"./testSqlite.db"))
{
rc = sqlite3_open("./testSqlite.db", &m_pDataBase);
//开启写数据同步
//rc = sqlite3_exec(m_pDataBase,"PRAGMA synchronous = OFF; ", 0, 0, 0);
//为每张表 添加存储过程
/*rc = sqlite3_exec(m_pDataBase,"drop table if exists student", 0, 0, 0); */
if (rc != SQLITE_OK)
{
AfxMessageBox(L"打开数据失败,请检查数据库是否已经损坏!");
sqlite3_close(m_pDataBase);
}
return;
}
else//
{
//1、创建数据testSqlite.m_pDataBase
rc = sqlite3_open("./testSqlite.db", &m_pDataBase);
if (rc != SQLITE_OK) AfxMessageBox(L"创建数据库(testSqlite.db)失败!");
////开启写数据同步
//rc = sqlite3_exec(m_pDataBase,"PRAGMA synchronous = OFF; ", 0, 0, 0);
//为每张表 添加存储过程
/*rc = sqlite3_exec(m_pDataBase,"drop table if exists student", 0, 0, 0);*/
//数据不存在,新建了数据,现在往数据添加一张表,并为其中的一张表建立索引
//函数sqlite3_exec():插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息
//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
//第三个参数为callback函数,这里没有用,第四个参数为callback函数
//中的第一个参数,第五个为出错信息
CString sErrMsg;
//2、创建表(runrecord)
rc = sqlite3_exec(m_pDataBase, "create table student(szName char(32), iAge int, bSex bool, szClass varchar(64), szSchool char(32))", 0, 0, &errMsg);
if (rc != SQLITE_OK)
{
sErrMsg += errMsg;
AfxMessageBox(L"创建表(runrecord)失败! 失败原因:" + sErrMsg);
return;
}
}
}
好现在运行一下代码,会在当前目录新建一个名字为testSqlite.db的数据,看到以下内容,说明穿数据库成功,这个数据值创建了一张名为student的表,表的字段有:szName(名字), iAge(年龄), bSex(性别), szClass(班级), szSchool(学校)
3.3 在testSqliteDlg.h文件中添加曾、删、改、查四个,AddData()、DelData()、ChangeData()、CheckData()。
并在OnInitDialog()函数调用这四个函数
3.3.1 在testSqliteDlg.cpp中实现AddData()函数代码
void CtestSqliteDlg::AddData() //添加数据
{
//5. 开始写入数据库,写到表runrecord
char *pErrMsg = NULL;
int iType = -1;
char *buf = new char[1024];
memset(buf, 0, 1024);
sprintf(buf, "insert into student values('%s', '%d', '%s', '%s', '%s')", "张晓明", 23, "男", "13计算机网络", "广西大学");
//解决写中文到sqlite乱码
CString sData(buf);
USES_CONVERSION;
wchar_t* pWchar = A2W(sData);
std::string szData = Unicode2Utf8(pWchar);
memcpy(buf, szData.data(), strlen(szData.data()));
//开始写数据到数据库
sqlite3_exec(m_pDataBase, "begin;", 0, 0, &pErrMsg); //显式开启事务 提高插入数据的速度
iType = sqlite3_exec(m_pDataBase, buf, 0, 0, &pErrMsg);
sqlite3_exec(m_pDataBase, "commit;", 0, 0, &pErrMsg);
delete[] buf;
}
/********************************************************
* 函数名称:Unicode2Utf8
* 函数功能:Unicode 转 Utf8库
* 输入参数: 无
* 输出参数: 无
* 返回值 : 无
* 日 期 : 2018.9.05
* 作 者 : mark
********************************************************/
std::string CtestSqliteDlg::Unicode2Utf8(const std::wstring& widestring)
{
//1. 计算宽字符的长度
int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);
if (utf8size == 0)
{
throw std::exception("Error in conversion.");
}
//2. Unicode 转 Utf8
std::vector<char> resultstring(utf8size);
int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);
if (convresult != utf8size)
{
throw std::exception("La falla!");
}
return std::string(&resultstring[0]);
}
运行一下代码,利用Sqliteman查看一下刚刚写入的数据
3.3.2 剩下的三个函数就不实现,如果不会可以私信我
注释:工程源码我上传我的博客,下载地址:https://download.csdn.net/download/cwj066/10648018