Windows+vs2010使用Sqlite

第一步:准备工具。

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

猜你喜欢

转载自blog.csdn.net/cwj066/article/details/82425356