• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

QT的mysql(数据库)最佳实践和常见问题解答

武飞扬头像
Helloorld_1
帮助1

涉及到数据库,首先安利一个软件Navicat Premium,用来查询数据库很方便 

学新通

QMysql驱动是Qt SQL模块使用的插件,用于与MySQL数据库进行通信。要编译QMysql驱动,您需要满足以下条件:

  • 您需要安装MySQL的客户端库和开发头文件,这些文件通常随MySQL的安装程序一起提供,或者可以从MySQL官网下载。请注意,您需要根据您的Qt架构(32位或64位)选择正确的数据库库文件。
  • 您需要获取Qt的源代码,这些代码可以从Qt官网下载。您可以选择与您的Qt版本相匹配的源代码,也可以选择最新的源代码。
  • 您需要使用qmake和make工具来编译QMysql驱动,这些工具通常随Qt的安装程序一起提供,或者可以从Qt官网下载。请注意,您需要根据您的操作系统和编译器选择正确的工具。

由于现在版本的QT的Qmysql在安装的时候没有,需要自行去编译这个dll文件出来。

编译出QMysql的相关dll文件的步骤如下:

  • 打开Qt命令提示符,进入Qt源代码目录下的qt/src/plugins/sqldrivers/mysql文件夹,例如:
F:\QT\5.12.9\Src\qtbase\src\plugins\sqldrivers\mysql

然后把下面这一行代码注释掉:并且配置mysql的地址,如下面所示:

学新通

Copy

  • 运行qmake命令,指定MySQL的头文件和库文件的路径,例如:
  1.  
     
  2.  
    INCLUDEPATH = "E:/mysql/mysql-5.7.27-winx64/include"
  3.  
    DEPENDPATH = "E:/mysql/mysql-5.7.27-winx64/include"
  4.  
    LIBS = "E:/mysql/mysql-5.7.27-winx64/lib/libmysql.lib"
  5.  
    DESTDIR = ../mysql/mylib

Copy

  • 运行make或mingw32-make命令,根据您的编译器类型(如果是在VS环境下使用sql,那么就只需要在VS的编译器下面进行编译)选择合适的命令,例如:
mingw32-make

Copy

  • 如果编译成功,您将在当前目录下看到一个名为qsqlmysql.dll的文件,这就是QMysql插件。您需要将这个文件复制到您运行Qt应用程序时使用的Qt目录下的qt/plugins/sqldrivers文件夹中,例如:
F:\QT\5.12.9\msvc2017_64\plugins\sqldrivers

学新通

学新通

然后就是如何在QT里面使用Qmysql功能;首先,咱们需要先引入头文件,文件如下:

  1.  
    #include <QtSql/QSqlDatabase> // 连接数据库
  2.  
    #include <QtSql/QSqlError> // 数据库连接失败打印报错语句
  3.  
    #include <QtSql/QSqlQuery> // 数据库操作(增删改查)
  4.  
    #include <QSqlQueryModel>

我定义了一下函数名,用来在cpp文件里面写入:

  1.  
    Q_OBJECT
  2.  
    public:
  3.  
    mysql(QWidget *parent);
  4.  
    ~mysql();
  5.  
    void insert(QString InserName,int id,QString symbol,QString value);
  6.  
    void insert_line(QString InserName,QString id,QString symbol,QString value,QString v,QString despoitory);
  7.  
     
  8.  
    void data_connect(bool,bool);//连接数据库
  9.  
    void data_test_connect(QStringList);//测试能否成功连接数据库
  10.  
    void close_data();
  11.  
    void creat_table(QString TableName);//创建一个表
  12.  
    void update_table(QString InserName,QString id,QString key,QString value);//更新数据库
  13.  
    void delete_table(QString TableName,QString id);//删除数据库
  14.  
    void find_alltable(QString datebase);//查找所有数据路表格
  15.  
    void find_table_inf(QString TableName);//查询某个表中的数据
  16.  
    void find_table_row(QString TableName,QString row_name,QString col_name);//查询表中某一行的数据
  17.  
    void find_table_col(QString TableName,QString col_name);//表名,列名
  18.  
    void find_table_desposite(QString TableName,QString col_name);//表名,列名查询储位名

对应的函数名里面,实现的功能如下所示:

首先是连接数据库部分功能

  1.  
    QSettings *myini=new QSettings("info.ini", QSettings::IniFormat);//构造QSettings对象,访问ini文件
  2.  
    QStringList info_digitial={"digitial_type","hostname","port","database_name","user_name","password"};
  3.  
    QStringList s;
  4.  
    //设置键值对
  5.  
    s.clear();
  6.  
    myini->beginGroup("digital");
  7.  
    for(int i=0;i<info_digitial.size();i )
  8.  
    {
  9.  
    s.append(myini->value(info_digitial[i]).toString());
  10.  
    }
  11.  
    myini->endGroup();
  12.  
    delete myini;
  13.  
    //输出可用数据库
  14.  
    qDebug()<<"available drivers:";
  15.  
    QStringList drivers = QSqlDatabase::drivers();
  16.  
    foreach(QString driver, drivers)
  17.  
    qDebug()<<driver;//输出中含有MySQL,那么恭喜你说明你的qt有MySQL驱动了
  18.  
     
  19.  
    QSqlDatabase db = QSqlDatabase::addDatabase(s[0]);
  20.  
    db.setHostName(s[1]);
  21.  
    db.setPort(s[2].toInt());
  22.  
    db.setDatabaseName(s[3]);//数据库名
  23.  
    db.setUserName(s[4]);//用户名
  24.  
    db.setPassword(s[5]);//密码
  25.  
    bool ok = db.open();//打开并连接数据库
  26.  
    if(message_prompt)
  27.  
    {
  28.  
    if (ok){
  29.  
    QMessageBox::information(this, "infor", "success connect");
  30.  
    }
  31.  
    else {
  32.  
    QMessageBox::information(this, "infor", "open failed");
  33.  
    qDebug()<<"error open database because"<<db.lastError().text();
  34.  
    }
  35.  
    }

我这里是通过读取ini文件里面存储的信息,来获得数据库的设置,主要包含有: 

学新通

定义一个QSqlDatabase 对象db,实例化它,如果能够成功connect,则会返回一个布尔值,在这里我通过这个bool值来判断,是否成功连接上数据库了。

然后就是在数据库里面创建一个table,并且想里面插入值:

  1.  
     
  2.  
    QSqlQuery query;
  3.  
    QString sql=QString("create table %1(订单号 text, 料号 text, 品名 text, 数量 text,储位 text);").arg(TableName);//"订单号","料号","品名","数量"
  4.  
    qDebug()<<"SQL"<<sql;
  5.  
     
  6.  
    //创建表是否成功
  7.  
     
  8.  
    if (!query.exec(sql))//.exec(),作用是开启一个循环,执行一个事件,相当于while(1)
  9.  
     
  10.  
    {
  11.  
    qDebug() << QString::fromLocal8Bit("creat table failed:") << query.lastError();
  12.  
     
  13.  
    }
  14.  
     
  15.  
    else
  16.  
     
  17.  
    {
  18.  
    qDebug() << QString::fromLocal8Bit("creat table success!");
  19.  
     
  20.  
    }

在表table里面插入数据的功能实现如下所示:

  1.  
    QSqlQuery query;
  2.  
    QString str=QString("insert into %4(序号,标签,value) values(%1,'%2','%3')").arg(id).arg(symbol).arg(value).arg(InserName);
  3.  
    if(query.exec(str)==false)
  4.  
    {
  5.  
    qDebug() << "insert failed";
  6.  
    QMessageBox::warning(this,u8"数据插入错误",u8"请检查数据是否正确");
  7.  
    }
  8.  
    else
  9.  
    {
  10.  
    QMessageBox::information(this, "insert", "insert connect");
  11.  
    qDebug() <<"insert success";
  12.  
    }

更新数据的功能实现,代码部分如下所示:

  1.  
    QSqlQuery query;
  2.  
    QString updata = QString("update %1 set %2='%3' where 订单号='%4'").arg(InserName).arg(column).arg(value).arg(row);
  3.  
    qDebug()<<"--update--"<<updata;
  4.  
    if (!query.exec(updata))
  5.  
    {
  6.  
    qDebug() << QString::fromLocal8Bit("updata failed!") << query.lastError();
  7.  
    }
  8.  
    else
  9.  
    {
  10.  
    qDebug() << QString::fromLocal8Bit("updata success!");
  11.  
    }

前面我们提了如何创建数据库的table和插入数据的功能实现,下面我们就谈一谈这个数据库的删除功能的视线,代码部分,如下所示:

  1.  
    QSqlQuery query;
  2.  
    QString sql = QString("delete from %1 where 订单号 = '%2'").arg(TableName).arg(id);
  3.  
    if(query.exec(sql))
  4.  
    {
  5.  
    qDebug()<<"delete success!";
  6.  
    }
  7.  
    else
  8.  
    {
  9.  
    qDebug()<<"delete failed!";
  10.  
    }

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiahjji
系列文章
更多 icon
同类精品
更多 icon
继续加载