文章目录
- Qt操作数据库
- QSqlDataBase
- QSqlQuery
- 执行SQL语句
- QSqlRecord
- QSqlField
- 数据库模型
- QSqlQueryModel
- QSqlTableModel
- QSqlRelationalTableModel
- 编译MySql驱动msvc版本
- MySql客户端程序部署
Qt操作数据库
需要在cmakelist加上Sql模块
QSqlDataBase
可以通过静态成员查看支持的所有驱动
qInfo() << QSqlDatabase::drivers();
QSqlQuery
数据库用例
执行SQL语句
- 查询
QSqlQuery query("select * from tab1"); // 设置查询语句query.exec(); // 执行查询qDebug() << query.record().count(); // 获取字段数qDebug() << query.size(); // 记录数量,即查询出几行数据while (query.next()) {qDebug() << query.value(1).toString(); // 第一列的数据qDebug() << query.value("id").toString(); // 字段名为deptno的数据}
- 插入
方法1
QSqlQuery query;bool r = query.exec("INSERT INTO tab1 (id) ""VALUES (1002)");if (r)qDebug() << "插入成功";
方法2
QSqlQuery query;query.prepare("INSERT INTO tab1(id,age,name)""VALUES(?,?,?)");query.addBindValue(2001);query.addBindValue(12);query.addBindValue("张三");if (query.exec())qDebug() << "插入成功";
方法3
QSqlQuery query;query.prepare("INSERT INTO tab1(id,age,name)""VALUES(:id,:age,:name)");query.bindValue(":id", 2024);query.bindValue(":age", 12);query.bindValue(":name", "李四");if (query.exec())qDebug() << "插入成功";
方法4
QSqlQuery query;query.prepare("insert into tab1 values(?,?,?,?)");QVariantList ids = QVariantList() << 3001 << 3002 << 3003;QVariantList ages = QVariantList() << 11 << 12 << 13;QVariantList names = QVariantList() << "a1"<< "a2"<< "a3";QVariantList sexs = QVariantList() << 0 << 1 << 0;query.addBindValue(ids);query.addBindValue(ages);query.addBindValue(names);query.addBindValue(sexs);if (!query.execBatch())qDebug() << query.lastError();elseqDebug() << "插入成功";
QSqlRecord
qDebug() << db.tables(); // 获取所有表名qDebug() << db.record("tab1"); // 获取表的字段
QSqlField
QSqkField表示数据库或表视图中单个列的特征,例如数据类型和列名。字段还包含数据库列的值,可以查看或更改该值。字段数据值存储为qvariant,不允许使用不兼容的类型。
QSqlRecord rec = db.record("tab1");QSqlField field("score", QMetaType::fromType<int>());rec.append(field); // 添加score字段field.setValue(QString("123")); // 这里会把字符串转化成intfor (int i = 0; i < rec.count(); i++) {qDebug() << rec.fieldName(i) << rec.value(i);}
尽管用QsqlField添加了字段,但数据库里实际并没有发生改变
数据库模型
模型操作参考第十四章
QSqlQueryModel
只读模式,不能更改
void Widget::sqlTableview()
{qInfo() << QSqlDatabase::drivers();QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setUserName("root");db.setPassword("123456");db.setDatabaseName("hello");if (!db.open())qDebug() << "数据库连接失败" << db.lastError().text();// 创建模型QSqlQueryModel* model = new QSqlQueryModel;model->setQuery("select * from tab1");// 创建视图QTableView* view = new QTableView;view->setModel(model);view->show();
}
QSqlTableModel
可以更改数据
void Widget::sqlTableview2()
{QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setUserName("root");db.setPassword("123456");db.setDatabaseName("hello");if (!db.open())qDebug() << "数据库连接失败" << db.lastError().text();QSqlTableModel* model = new QSqlTableModel;model->setTable("tab1"); // 设置表model->setEditStrategy(QSqlTableModel::OnFieldChange); // 设置编辑策略,在视图里修改,立刻在数据库里也更改model->select();QTableView* view = new QTableView;view->setModel(model);view->show();model->setHeaderData(0, Qt::Horizontal, "tab_id"); // 设置第0列水平头的字段为tab_id
}
QSqlRelationalTableModel
编译MySql驱动msvc版本
Qt5.13版本后不包含MySql的驱动插件,需要自己手动编译
-
看下G:\Qt\6.6.3\Src 有没有这个文件夹(没有的用qt维护工具安装当前版本QT的Sources)Qt版本不同的后面路径自行修改
-
看下C:\Program Files\MySQL\MySQL Server 8.3(没有的去mysql官方下载安装)如果安装在别的文件夹,后面用到的路径自行修改一下
-
进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers用记事本打开.cmake.conf,添加如下代码
set(QT_REPO_MODULE_VERSION "6.6.3")
SET(FEATURE_sql_mysql ON)
SET(MySQL_INCLUDE_DIR "C:/Program Files/MySQL/MySQL Server 8.3/include")
SET(MySQL_LIBRARY "C:/Program Files/MySQL/MySQL Server 8.3/lib/libmysql.lib")
-
用QtCreator打开当前文件夹的CMakeLists.txt
-
点击项目>构建>Current Configuration 往下拉 找到FEATURE_sql_mysql 勾选(已经有的跳过这一步)
-
点击执行CMake,项目里有mysql就说明成功了
-
选择Debug,点击左下角小锤子构建项目
-
选择release ,同样构建一下项目(后面release项目的操作和debug类似,这里省略)
-
进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers\build\Desktop_Qt_6_6_3_MSVC2019_64bit-Debug\plugins\sqldrivers
复制qsqlmysqld.dll和qsqlmysqld.pdb
-
进入G:\Qt\6.6.3\Src\qtbase\src\plugins\sqldrivers\build\Desktop_Qt_6_6_3_MSVC2019_64bit-Debug\plugins\sqldrivers 粘贴刚才复制的文件
-
进入C:\Program Files\MySQL\MySQL Server 8.3\lib复制libmysql.dll到G:\Qt\6.6.3\msvc2019_64\bin
12. 运行代码测试一下
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlError>int main(int argc, char* argv[])
{QCoreApplication a(argc, argv);qInfo() << QSqlDatabase::drivers();QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setUserName("root");db.setPassword("123456");//这里替换成自己的数据库密码db.setDatabaseName("test");if (db.open())qDebug() << "数据库连接成功";elseqDebug() << "数据库连接失败" << db.lastError().text();return a.exec();
}
MySql客户端程序部署
如果你的程序使用了MySQL数据库,那么在部署时,需要将MySql的依赖,一并拷贝到exe同级目录。
上面3个库拷贝进去,双击运行即可