zoukankan      html  css  js  c++  java
  • Qt-数据库操作MySql

    1  简介

    参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=87

    说明:本文简单说明在Qt中操作数据库,用MySql数据库进行试验。

    Qt 提供了QtSql模块来提供平台独立的基于 SQL 的数据库操作。

    2  MySql的安装及简单使用

    视频对应的资源文件已经说得很清楚了,这里就不单独进行说明了。给出下载的链接:

    链接:https://pan.baidu.com/s/1ZThzPvYs41dlGeAid--agg
    提取码:zony

    sql语句也不在这里进行说明,去查询相关的资料即可。

    3  测试及说明

    先创建一个工程:

    使用QSqlDatabase::drivers();函数查看Qt支持的数据库驱动,可以看到支持:("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")这些数据库。

    1、简单的使用

    接下来,我要以root用户操作test数据库,对test数据库的表进行操作:

     大致步骤如下:

    (1)添加sql模块

    在.pro文件中添加语句:QT += core gui sql

    (2)添加MySql数据库

    1     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    (3)连接数据库

    1     db.setHostName("127.0.0.1");  //数据库服务器IP
    2     db.setUserName("root");    //数据库用户名
    3     db.setPassword("123456");  //密码
    4     db.setDatabaseName("test");  //使用哪个数据库

    (4)打开数据库

    1     if (db.open() == false) {
    2         QMessageBox::warning(this, "错误", db.lastError().text());
    3         return;
    4     }

    (5)执行sql语句

    1     //操作sql语句
    2     QSqlQuery query;
    3     query.exec("create table student(id int primary key, name varchar(255), age int, score int);");

    执行的时候可能会报以下错误:

    这时,我们将MySql的安装路径下的文件拷贝到Qt的安装目录下,关闭Qt,再次打开执行就不会报错了:

    上述步骤的完整代码:

     1 Widget::Widget(QWidget *parent) :
     2     QWidget(parent),
     3     ui(new Ui::Widget)
     4 {
     5     ui->setupUi(this);
     6 
     7     //打印qt支持的数据库驱动
     8     qDebug() << QSqlDatabase::drivers();
     9 
    10     //添加MySql数据库
    11     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    12     //连接数据库
    13     db.setHostName("127.0.0.1");  //数据库服务器IP
    14     db.setUserName("root");    //数据库用户名
    15     db.setPassword("123456");  //密码
    16     db.setDatabaseName("test");  //使用哪个数据库
    17     //打开数据库
    18     if (db.open() == false) {
    19         QMessageBox::warning(this, "错误", db.lastError().text());
    20         return;
    21     }
    22     //操作sql语句
    23     QSqlQuery query;
    24     query.exec("create table student(id int primary key, name varchar(255), age int, score int);");
    25 }
    View Code

    运行测试:

    2、使用方式2

    在添加MySql时,我们给数据库连接一个名字,addDatabase函数的第二个参数,这样可以为一个数据库建立多个连接。

    1 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "mydb");

    通过这种方式,我们使用QSqlQuery执行MySql语句时,必须指定数据库名字:

    1 1 //操作sql语句
    2 2     QSqlQuery query(db);
    3 3     query.exec("insert into student(id, name, age, score) values(1, 'mike', 18, 59);");

    3、批量插入

    (1)方式一:

     1     //odbc风格
     2     //预处理语句
     3     query.prepare("insert into student(name, age, score) values(?, ?, ?);");
     4     // 给字段设置内容
     5     QVariantList nameList;
     6     nameList << "xiaoming" << "xiaokong" << "xiaojiang";
     7     QVariantList ageList;
     8     ageList << 22 << 21 << 24;
     9     QVariantList scoreList;
    10     scoreList << 89 << 99 << 78;
    11     //给字段绑定相应的值,必须按顺序绑定
    12     query.addBindValue(nameList);
    13     query.addBindValue(ageList);
    14     query.addBindValue(scoreList);
    15     //执行预处理命令
    16     query.execBatch();

    QSqlQuery::prepare()函数对这条 SQL 语句进行预处理,问号 ? 相当于占位符,预示着以后我们可以使用实际数据替换这些位置。

    QSqlQuery::addBindValue()我们将实际数据绑定到这个预处理的 SQL 语句上。

    QSqlQuery::execBatch()批量执行 SQL,之后结束该对象。

    (2)方式二:

     1     //oracle风格:占位符 + 自定义名字
     2     query.prepare("insert into student(name, age, score) values(:name, :age, :score)");
     3     //给字段设置内容
     4     QVariantList nameList;
     5     nameList << "xiaoa" << "xiaob" << "xiaoc";
     6     QVariantList ageList;
     7     ageList << 21 << 19 << 24;
     8     QVariantList scoreList;
     9     scoreList << 77 << 66 << 70;
    10     //给字段绑定对应的值,不需要指定顺序
    11     query.bindValue(":name", nameList);
    12     query.bindValue(":score", scoreList);
    13     query.bindValue(":age", ageList);
    14     //执行预处理命令
    15     query.execBatch();

    推荐使用方式二。

    4  查找

    现有一个数据库如下:

     查找所有的条目:

    1     QSqlQuery query;
    2     query.exec("select * from student");
    3     while (true == query.next()) {  //一行一行遍历
    4         //取出当前行的内容,以列为单位
    5         qDebug() << query.value(0).toInt()  //取第一列
    6                  << query.value(1).toString() //取第二列
    7                  << query.value("age").toInt()  //按名字查找
    8                  << query.value("score").toInt();
    9     }

    查找某一条:

    1     query.exec("select * from student where name = 'xiaoa'");
    2     while (true == query.next()) {  //一行一行遍历
    3         //取出当前行的内容,以列为单位
    4         qDebug() << query.value(0).toInt()  //取第一列
    5                  << query.value(1).toString() //取第二列
    6                  << query.value("age").toInt()
    7                  << query.value("score").toInt();
    8     }

    5  删除

    使用事务进行操作,首先创建一个ui,如下:

     行编辑区输入我们要删除的name,删除按钮删除该条目,确定删除按钮确认删除该条目,取消按钮取消删除操作。

    完整代码如下:

     1 #include "widget.h"
     2 #include "ui_widget.h"
     3 #include <QDebug>
     4 #include <QSqlDatabase>
     5 #include <QMessageBox>
     6 #include <QSqlError>
     7 #include <QSqlQuery>
     8 
     9 Widget::Widget(QWidget *parent) :
    10     QWidget(parent),
    11     ui(new Ui::Widget)
    12 {
    13     ui->setupUi(this);
    14 
    15     //打印qt支持的数据库驱动
    16     qDebug() << QSqlDatabase::drivers();
    17 
    18     //添加MySql数据库
    19     QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    20     //连接数据库
    21     db.setHostName("127.0.0.1");  //数据库服务器IP
    22     db.setUserName("root");    //数据库用户名
    23     db.setPassword("123456");  //密码
    24     db.setDatabaseName("test");  //使用哪个数据库
    25     //打开数据库
    26     if (db.open() == false) {
    27         QMessageBox::warning(this, "错误", db.lastError().text());
    28         return;
    29     }
    30    
    31 }
    32 
    33 Widget::~Widget()
    34 {
    35     delete ui;
    36 }
    37 
    38 void Widget::on_pushButton_delete_clicked()
    39 {
    40     //获取行编辑内容
    41     QString name = ui->lineEdit->text();
    42     QString sql = QString("delete from student where name='%1'").arg(name);
    43     qDebug() << sql;
    44     //开启一个事务
    45     QSqlDatabase::database().transaction();
    46     // 执行sql语句
    47     QSqlQuery query;
    48     query.exec(sql);
    49 }
    50 
    51 void Widget::on_pushButton_sure_clicked()
    52 {
    53     //确定删除
    54     QSqlDatabase::database().commit();
    55 }
    56 
    57 void Widget::on_pushButton_cancel_clicked()
    58 {
    59     //回滚、撤销
    60     QSqlDatabase::database().rollback();
    61 }
    View Code

    运行测试,操作之前数据库中已经有了一些数据:

  • 相关阅读:
    python json模块 pickli模块
    python sys模块
    python os模块
    python random模块使用
    react项目搭建
    PHP开发环境及搭建
    Vue2之页面 、js 、css分离
    Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
    Uncaught Error: Bootstrap's JavaScript requires jQuery
    Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/13326726.html
Copyright © 2011-2022 走看看