Zero, reference document
https://doc.qt.io/archives/qt-6.0/qsqldatabase.html
1. Development environment
Ubuntu 20.04
QT6.0
Microsoft SQL Server 2022 Developer Edition (64-bit)
First modify the data source configuration of /etc/odbc.ini and specify the connection database vdb.
sudo vim /etc/odbc.ini
[mssql]
Driver=MSSQL
#USER=sa
#Password=123456789
PORT=1433
SERVER=localhost
Database=vdb
create project,
Pro configuration enables the sql module,
QT += sql
Create a new header file 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
Then reference this header file in 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();
}
2.QSqlQuery
Add four Push Buttons to the main window and bind click signal slot functions to the four buttons.
Then implement four slot functions respectively in 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();
}
}
3. Parameter binding
#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();
}
}
4. Batch processing
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;
}
}
5. Affairs
void MainWindow::on_delete_btn_clicked()
{
// transaction start
QSqlDatabase::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 commit
QSqlDatabase::database().commit();
}