零、参考文档
https://doc.qt.io/archives/qt-6.0/qsqldatabase.html
一、开发环境
Ubuntu 20.04
QT6.0
Microsoft SQL Server 2022 Developer Edition (64-bit)
先修改 /etc/odbc.ini 的数据源配置,指定连接数据库 vdb,
sudo vim /etc/odbc.ini[mssql]
Driver=MSSQL
#USER=sa
#Password=123456789
PORT=1433
SERVER=localhost
Database=vdb
创建项目,
pro 配置开启 sql 模块,
QT += sql
新建头文件 connection.h,
// connection.h
#ifndef CONNECTION_H
#define CONNECTION_H#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>static bool connect_mssql(){// 数据库配置QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");QString dsn = QString::fromLocal8Bit("mssql");// 数据源名称db.setDatabaseName(dsn);// 服务器名称db.setHostName("localhost");db.setPort(1433);// 用户名db.setUserName("sa");// 密码db.setPassword("123456789");// 数据库连接bool ok = db.open();if(ok){qDebug() << "db open ok!";}else {qDebug() << "db open error: " << db.lastError();}return ok;
}#endif // CONNECTION_H
然后再在 main.cpp 中引用这个头文件,
// main.cpp
#include "mainwindow.h"
#include "connection.h"
#include <QApplication>int main(int argc, char *argv[])
{if(!connect_mssql()){return 1;}QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
二、QSqlQuery
主窗口添加四个 Push Button,为四个按钮绑定单击信号槽函数,
然后在 mainwindow.cpp 分别实现四个槽函数,
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_query_btn_clicked()
{QSqlQuery query;// 查找表中 color = LightPink 的数据query.exec("select id, color, rgb, del_flag from vdb.dbo.color_define where color = 'LightPink'");while(query.next()){int id = query.value(0).toInt();QString color = query.value(1).toString();QString rgb = query.value(2).toString();int del_flag = query.value(3).toInt();// 输出qDebug() << id << " " << color << " " << rgb << " " << del_flag;}
}void MainWindow::on_insert_btn_clicked()
{// 创建 QSqlQuery 对象QSqlQuery query;if (!query.exec("insert into vdb.dbo.color_define(color,rgb,del_flag) values('LightPink','255,182,193',0)")){qDebug() << query.lastError();}
}void MainWindow::on_update_btn_clicked()
{// 创建 QSqlQuery 对象QSqlQuery query;if (!query.exec("update vdb.dbo.color_define set del_flag = 1 where color = 'LightPink'")){qDebug() << query.lastError();}
}void MainWindow::on_delete_btn_clicked()
{// 创建 QSqlQuery 对象QSqlQuery query;if (!query.exec("delete vdb.dbo.color_define where color = 'LightPink'")){qDebug() << query.lastError();}
}
三、参数绑定
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_query_btn_clicked()
{QSqlQuery query;// 查找表中 color = LightPink 的数据query.prepare("select id, color, rgb, del_flag from vdb.dbo.color_define where color = :color");query.bindValue(":color","LightPink");query.exec();while(query.next()){int id = query.value(0).toInt();QString color = query.value(1).toString();QString rgb = query.value(2).toString();int del_flag = query.value(3).toInt();// 输出qDebug() << id << " " << color << " " << rgb << " " << del_flag;}
}void MainWindow::on_insert_btn_clicked()
{// 创建 QSqlQuery 对象QSqlQuery query;query.prepare("insert into vdb.dbo.color_define(color,rgb,del_flag) values(:color,:rgb,:del_flag)");query.bindValue(0,"LightPink");query.bindValue(1,"255,182,193");query.bindValue(2,0);if (!query.exec()){qDebug() << query.lastError();}
}void MainWindow::on_update_btn_clicked()
{// 创建 QSqlQuery 对象QSqlQuery query;query.prepare("update vdb.dbo.color_define set del_flag = 1 where color = :color");query.addBindValue("LightPink");if (!query.exec()){qDebug() << query.lastError();}
}void MainWindow::on_delete_btn_clicked()
{// 创建 QSqlQuery 对象QSqlQuery query;query.prepare("delete vdb.dbo.color_define where color = ?");//query.addBindValue("LightPink");query.bindValue(0,"LightPink");if (!query.exec()){qDebug() << query.lastError();}
}
四、批量处理
void MainWindow::on_batch_btn_clicked()
{// 创建 QSqlQuery 对象QSqlQuery query;query.prepare("insert into vdb.dbo.color_define(color,rgb,del_flag) values(?, ?, ?)");QVariantList colors;colors << "LightPink" << "OliveDrab" << "Tomato";query.addBindValue(colors);QVariantList rgbs;rgbs << "255,182,193" << "85,107,47" << "255,99,71";query.addBindValue(rgbs);QVariantList flags;flags << 0 << 0 << 0 ;query.addBindValue(flags);if (!query.execBatch()){qDebug() << query.lastError();}if(!query.exec("select top(100) * from vdb.dbo.color_define(nolock)")){qDebug() << query.lastError();}while(query.next()){int id = query.value(0).toInt();QString color = query.value(1).toString();QString rgb = query.value(2).toString();int del_flag = query.value(3).toInt();// 输出qDebug() << id << " " << color << " " << rgb << " " << del_flag;}
}
五、事务
void MainWindow::on_delete_btn_clicked()
{// transaction startQSqlDatabase::database().transaction();// 创建 QSqlQuery 对象QSqlQuery query;query.prepare("delete vdb.dbo.color_define where color = ?");query.addBindValue("LightPink");//query.bindValue(0,"LightPink");if (!query.exec()){qDebug() << query.lastError();}// transaction commitQSqlDatabase::database().commit();
}