Bootstrap

QT连接mysql数据库

QT连接mysql数据库的调试过程中遇到各种问题,最后终于调通。然后把代码封装成了类的形式,把现有代码进行了重构。在设计mysql连接类过程中,使用了分层设计的思想,尽量使类更加通用。

在头文件databasehelper中,定义DataBaseHelper,

#include <QSqlDatabase>

class DataBaseHelper
{
public:
    DataBaseHelper();
    static DataBaseHelper* get();
    QSqlDatabase db;
private:
    static DataBaseHelper* pBaseHelper;
};

DataBaseHelper();是构造函数,在该函数中实现数据库的连接。
db是连接实例,在类外可以通过类指针pBaseHelper的方式访问。
pBaseHelper是静态类指针,在类首次被实例化后被赋值,指向类本身。
static DataBaseHelper* get();是单例模式的关键函数,该函数内容为

DataBaseHelper* DataBaseHelper::get()
{
    if (pBaseHelper == NULL) {
        pBaseHelper = new DataBaseHelper();
    }
    return pBaseHelper;
}

在每次创建类对象时判定该指针是否为空,如果为空调用构造函数,并给这个变量赋值。如果不为空,则直接返回使用。
这样在需要使用类的地方不通过构造函数进行实例化,而是使用get函数获取类对象。

DataBaseHelper* mbh;
mbh = DataBaseHelper::get();

类的构造函数是实现数据库连接的关键,

DataBaseHelper::DataBaseHelper()
{
    db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setDatabaseName("csd");       //数据库名
    db.setUserName("root");        //用户名
    db.setPassword("12345678");   //密码

    if (!db.open())
    {
        QMessageBox::critical(0, QObject::tr("can't open database"),
        "can't connect to database! ", QMessageBox::Cancel);
        return;
    }

    //这儿可以做一些表格的创建工作,或者一些表格的自动导入。
    //如果程序需要使用的表不存在,则进行新建,比如如下例子:
    //说明:在维护良好的项目中,创建表的任务不会也不能用代码去做,因为客户端没有创建表的权限。
    QSqlQuery query(db);
    query.exec("SELECT table_name FROM information_schema.TABLES WHERE table_name ='COLORSPACE'");
    if(query.next())    //如果找不到指定的表COLORSPACE
    {
       QVariant var = query.value(0);
       QString str = var.toString();
    }
    else 
    {
        bool success = query.exec("CREATE TABLE COLORSPACE (_id int primary key AUTO_INCREMENT, uuid  varchar(50), color_name  varchar(20), l  varchar(10), a  varchar(10), b  varchar(10))");
        QMessageBox msgBox;
        if(success)
            msgBox.setText("The data table was created successfully.");
        else
            msgBox.setText("Cannot create data table");
        msgBox.exec();
    }
}

可以看到,DataBaseHelper类只有数据库连接的功能,要实现具体的任务,还需要在其上在封装一层与数据关联的类,我把它叫做数据绑定类。
数据绑定类也设计成单例模式,并在类的构造函数中使用DataBaseHelper::get()实例化数据库连接类。然后在数据绑定类中实现增删查改功能。相关的代码实现在原来的博客中进行过介绍
https://blog.csdn.net/iamqianrenzhan/article/details/84667926

刚打开这个链接博客看了看,发现上面的部分代码在原来的博客中出现过,不过这次是加了讲解和注释的版本,面向对设计模式不熟悉的初学者。

如果在连接数据库过程中出现

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL QMYSQL3 QODBC 

一般是qt默认安装的数据库驱动版本有问题,需要自己编译。在
https://blog.csdn.net/iamqianrenzhan/article/details/84839477
中有在Ubuntu系统中的解决方案,在window系统中的解决方案类似,核心就是要重新编译数据库驱动。

;