Windows下Qt的数据库(sqlite3)操作

Windows下Qt的数据库(sqlite3)环境配置

在这里插入图片描述

  • sqlite3.h (提供接口)放在工程文件夹下
  • sqlite3.dll (exe依赖的环境)放在debug文件夹,和exe放一起
  • sqlite3.lib (封装的源码)可以放在工程文件夹下的lib文件夹里

如下为Qt工程文件夹示例:
在这里插入图片描述
上述3个文件放置好之后,然后在.pro文件里加上:LIBS += $$PWD/lib/sqlite3.lib,执行qmake,此时就可以使用sqlite3数据库了。

LIBS += $$PWD/lib/sqlite3.lib

主函数测试是否配置成功

#include <QApplication>
#include <QDebug>
#include "sqlite3.h"
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    qDebug()<<"sqlite3";
 
    qDebug()<<"————数据库环境配置测试————";
 
    qDebug()<<"sqlite3版本号:"<<sqlite3_libversion();
 
    return a.exec();
}

在这里插入图片描述

QT结合sqlite3实现数据库单例

1、为什么数据库要用单例模式?

  1. 单例只保留一个对象,可以减少系统资源开销。
  2. 提高创建速度,每次都获取已经存在的对象,因此提高创建速度,且全局共享对象。
  3. 单例在系统中只存在一个对象实例,因此任何地方使用此对象都是同一个对象,这样就避免多实例化对象导致重复打开数据库。

2、单例模式(懒汉式)实现步骤

  1. 把构造私有化(保证只能自己实例化对象)。

  2. 定义一个私有的静态类对象指针(初始化为NULL)。

  3. 定义一个共有的静态获取类对象指针访问接口。

    只能实例化一个对象,比如窗口管理器。在一个应用程序中,一个类有且只有一个实例,并提供一个访问它的全局访问点。只有在第一次调用静态方法的时候才进行内存分配。如果整个程序不调用该静态方法,则不会分配内存,所以也叫“懒汉”模式。

Sqlite3相关API

1、sqlite3_open()打开或创建数据库

函数原型:

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

参数一:数据库名称(xxx.db)

参数二:sqlite *类型的数据库指针

返回值:返回值为1则数据库打开或创建失败,否则成功。

2、sqlite3_get_table()用于查询获取结果集

函数原型:

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);

参数一:sqlite3数据库指针

参数二:SQL语句

参数三:结果集

参数四:查询结果的行数

参数五:查询结果的列数

参数六:错误报告

返回值:返回值为0则执行语句成功,否则失败。

3、sqlite3_exec()执行SQL语句

函数原型:

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

参数一:sqlite3数据库指针

参数二:SQL语句

参数三:回调函数,可以用NULL

参数四:可以用0传参

参数五:错误报告

返回值:返回值为0则执行语句成功,否则失败。

4、sqlite3_close()关闭数据库

函数原型

int sqlite3_close(sqlite3 *);

测试代码

头文件

#ifndef DATABASE_H
#define DATABASE_H
 
#include "sqlite3.h"
 
class dataBase
{
public:
    static dataBase *getDataBase(char *dataBaseName);//静态获取类对象指针的方法
 
    static void createUserTable(char *tableName);//建表
 
    static int getData(const char *sql,char **&result,int &row,int &col);
 
    sqlite3 *getAppDataBase();
 
private:
    dataBase();
    dataBase(char *dataBaseName);
    ~dataBase();
 
    static dataBase *PdataBase;//类对象指针
 
    sqlite3 *appDataBase;//数据库指针
};
 
#endif // DATABASE_H

源文件

#include "database.h"
#include <QDebug>
#include <QString>
 
dataBase *dataBase::PdataBase = nullptr;
 
dataBase *dataBase::getDataBase(char *dataBaseName)
{
    if(dataBase::PdataBase == nullptr)
    {
        dataBase::PdataBase = new dataBase(dataBaseName);
    }
    return dataBase::PdataBase;
}
 
//创建用户表
void dataBase::createUserTable(char *tableName)
{
    char *zErrMsg = 0;
    QString createTablesql=QString("CREATE TABLE if not exists %1(\
                                   userID integer  primary key autoincrement,\
                                   userName varchar(255),\
                                   userPasswd varchar(255),\
                                   registerTime varchar(255)\
                                   );").arg(tableName);
    int  rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        qDebug()<<zErrMsg;
        qDebug()<<createTablesql;
    }
    else
    {
        qDebug()<<tableName<<"table created successfully!";
    }
}
 
 
//根据sql语句获取数据库数据
int dataBase::getData(const char *sql, char **&result, int &row, int &col)
{
    char *errmsg = 0;
    int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
    if(ret != SQLITE_OK)
    {
       qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
       qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
    }
    return 0;
}
 
//获取数据库指针
sqlite3 *dataBase::getAppDataBase()
{
    return this->appDataBase;
}
 
//构造
dataBase::dataBase()
{
 
}
 
 
//重载构造
dataBase::dataBase(char *dataBaseName)
{
    int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
    if(ret)
    {
        qDebug()<<"Can't open DataBase";
        qDebug()<<sqlite3_errmsg(appDataBase);
        exit(0);
    }
    else
    {
        qDebug()<<"Open"<<dataBaseName<<"successfully!";
    }
}
 
//析构函数,用于关闭数据库
dataBase::~dataBase()
{
    sqlite3_close(appDataBase);
}

主函数

#include <QApplication>
#include <QDebug>
#include "database.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    dataBase *data1 = dataBase::getDataBase("app.db");
    dataBase *data2 = dataBase::getDataBase("app.db");
 
    if(data1 == data2)//单例测试
    {
        qDebug()<<"这是同一个对象";
    }
 
    dataBase::createUserTable("user");//创建用户表
 
    return a.exec();
}

打印输出结果如下,会在工程目录底下生成一个app.db数据库,并且创建了一张用户表。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34623621/article/details/124762468