QT-操作数据库命令(小白学习分享)
1.SQL说明
对于数据库,可能大家都是既熟悉,又陌生,平时也使用QT来操作数据库,但是大部分都在网上查询,然后进行复制下来,供自己使用,对于深入的原理,不是很明白。
下面将自己学习的步骤进行分享,希望对大家有些许帮助。
头文件
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QSqlQuery>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
1.创建一个简单的项目,在main函数中创建一个简单的.db文件
代码:main.cpp
.
#include "mainwindow.h"
#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QMessageBox>
#include "queryform.h"
bool initSQLData()
{
QSqlDatabase m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("test.db");
if(!m_db.open())
{
QMessageBox::critical(nullptr,"error","sql is not open");
return false;
}
QSqlQuery query;
//创建一个表 person
query.exec("create table person("
"id int primary key,"
"firstname varchar(20),"
"lastname varchar(20)) ");
/****向table表中添加数据 *****/
//语法1:插入数据
query.exec("insert into person values(1,'合肥市','皖') ");
//语法2:插入数据
query.prepare("insert into person (id , firstname, lastname) "
"values(:id, :firstname, :lastname) ");
query.bindValue(":id",2);
query.bindValue(":firstname","济南");
query.bindValue(":lastname","鲁");
query.exec();
//语法3:插入数据 使用命名占位符的[位置]绑定
query.prepare("insert into person (id , firstname, lastname) "
"values(:id, :firstname, :lastname) ");
query.bindValue(0,3);
query.bindValue(1,"郑州");
query.bindValue(2,"豫");
query.exec();
//语法4:使用位置占位符绑定值(版本 1)
query.prepare("insert into person (id , firstname, lastname) "
"values(?, ?, ?) ");
query.bindValue(0,4);
query.bindValue(1,"南京");
query.bindValue(2,"苏");
query.exec();
//语法5:使用位置占位符绑定值(版本 2)
query.prepare("insert into person (id , firstname, lastname) "
"values(?, ?, ?) ");
query.addBindValue(5);
query.addBindValue("杭州");
query.addBindValue("浙");
query.exec();
return true;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if(!initSQLData()) return -1;
MainWindow w;
w.show();
return a.exec();
}
2.在Mainwindow中绘制显示数据库文件的UI界面。
3.在mainwindow中读取数据库,以及对应的保存、还原、退出操作。
代码:Mainwindow.cpp
.
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("数据库-数据操作指令");
tableSQL = new QSqlTableModel(this);
tableSQL->setTable("person"); // 设置需要操作的表
tableSQL->setEditStrategy(QSqlTableModel::OnManualSubmit); // 设置数据不自动保存到数据库表
tableSQL->select(); // 查询表中所有数据
qDebug()<<"======is:"<<tableSQL->select();
ui->tableView->setModel(tableSQL);
ui->tableView->resizeColumnsToContents(); // 根据表格中的内容自动调整列宽
}
MainWindow::~MainWindow()
{
delete ui;
}
/**
* @brief 开启sqlite事务并提交修改,相对于直接使用submitAll更有优势(开始事务可以优化写入大量数据速度)
*/
void MainWindow::on_btnSave_clicked()
{
bool ret = tableSQL->database().transaction();
if(!ret)
return;
if(tableSQL->submitAll()) //提交所有修改,如果开启了事务,则保存事务
{
tableSQL->database().commit();
QMessageBox::information(this,"information"," save is success!");
}
else
{
tableSQL->database().rollback();
QMessageBox::warning(this, "错误!", QString("数据提交错误:%1").arg(tableSQL->lastError().text()));
}
}
/**
* @brief 还原未提交的修改
*/
void MainWindow::on_btnResize_clicked()
{
tableSQL->revertAll();
}
/**
* @brief 退出修改
*/
void MainWindow::on_btnQuit_clicked()
{
this->close();
}
4.编译后运行界面
5.结尾
详细代码已在文中展示。