文章目录
- 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();
else
qDebug() << "插入成功";
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")); // 这里会把字符串转化成int
for (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() << "数据库连接成功";
else
qDebug() << "数据库连接失败" << db.lastError().text();
return a.exec();
}
MySql客户端程序部署
如果你的程序使用了MySQL数据库,那么在部署时,需要将MySql的依赖,一并拷贝到exe同级目录。
上面3个库拷贝进去,双击运行即可