流程图:
![](https://i-blog.csdnimg.cn/blog_migrate/cca602a0ba745a8192c8bfff88422f08.png)
myWidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QDebug>
#include<QSqlDatabase>//数据库
#include<QMessageBox>
#include<QSqlError>//sql错误信息
#include<QSqlQuery>//sql语句类
#include<QVariantList>//泛型
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
//打印Qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
//添加MySql数据库
//只连接一个数据库,addDatabase第二个参数不用写
QSqlDatabase db= QSqlDatabase::addDatabase("QMYSQL");
//链接数据库
db.setHostName("127.0.0.1");//数据库服务器IP
db.setUserName("root");//数据库用户名
db.setPassword("root");//数据库密码
db.setDatabaseName("dbtest1");//使用那个数据库
//打开数据库
if(db.open()==false)
{
QMessageBox::information(this,"失败",db.lastError().text());
return;
}
#if 0
//创建表
QSqlQuery query;
query.exec("create table student(id int primary key auto_increment,name varchar(255),age int,score int)");
//表内插入数据
QSqlQuery query;
query.exec("insert into student(id,name,age,score)values(2,'zx',18,60)");
#endif
#if 0
//添加MySql数据库
//如果要连接两个数据库,addDatabase第二个参数随便写,初始化时要传参QSqlQuery query1(db1)
QSqlDatabase db1= QSqlDatabase::addDatabase("QMYSQL","a");
//链接数据库
db1.setHostName("127.0.0.1");//数据库服务器IP
db1.setUserName("root");//数据库用户名
db1.setPassword("root");//数据库密码
db1.setDatabaseName("dbtest2");//使用那个数据库
//打开数据库
if(db1.open()==false)
{
QMessageBox::information(this,"失败",db1.lastError().text());
return;
}
QSqlQuery query1(db1);
query1.exec("create table student(id int primary key,name varchar(255),age int,score int)");
#endif
#if 0
//批量插入
//odbc风格
//预处理语句 ? 相当于占位符
query.prepare("insert into student(id,name,age,score)values(?,?,?,?)");
//给字段设置内容 list
QVariantList idlist;
idlist<<8<<9<<10;
QVariantList namelist;
namelist<<"xiaoming"<<"xiaolong"<<"xiaojiang";
QVariantList agelist;
agelist<<11<<28<<33;
QVariantList scorelist;
scorelist<<59<<60<<65;
//给字段绑定相应的值
query.addBindValue(idlist);
query.addBindValue(namelist);
query.addBindValue(agelist);
query.addBindValue(scorelist);
//执行预处理命令
query.execBatch();
#endif
#if 0
//oracle风格
//占位符 :+自定义名字
query.prepare("insert into student(id,name,age,score) values(:id,:name,:age,:score)") ;
//给字段设置内容
QVariantList idlist ;
idlist<<8<<9<<10 ;
QVariantList nameList ;
nameList <<"小红"<<"小绿"<< "小蓝" ;
QVariantList ageList ;
ageList <<31<<31<<32 ;
QVariantList scoreList ;
scoreList<< 44 << 44 << 44 ;
//给字段绑定
query.bindValue(":id",idlist);
query.bindValue(":name",nameList);
query.bindValue(":age",ageList);
query.bindValue(":score",scoreList);
//执行预处理命令
query.execBatch();
#endif
}
MyWidget::~MyWidget()
{
delete ui;
}
//删除
void MyWidget::on_buttondelete_clicked()
{
//获取行编辑内容
QString name= ui->lineEdit->text();
QString str=QString("delete from student where name='%1'").arg(name);
#if 1
//第一种开启事物方法
QSqlDatabase::database().transaction();//获取当前操作数据库
QSqlQuery query;
query.exec(str);
#endif
#if 0
//第二种开启事物方法
QSqlDatabase db=QSqlDatabase::database();
if(db.isOpen()==true)
{
qDebug()<<"数据库打开";
db.exec("START TRANSACTION;");
}
#endif
#if 0
//第三种开启事物方法
QSqlQuery query;
query.exec("START TRANSACTION");
query.exec(str);
#endif
}
//确定删除
void MyWidget::on_buttonsure_clicked()
{
#if 1
//第一种确定方法
QSqlDatabase::database().commit();
#endif
#if 0
//第二种确定方法
QSqlDatabase db=QSqlDatabase::database();
if(db.isOpen()==true)
{
qDebug()<<"确定删除";
db.exec("commit;");
}
#endif
#if 0
//第三种确定方法
QSqlQuery query;
query.exec("COMMIT");
#endif
}
//取消删除,回滚撤销
void MyWidget::on_buttoncancel_clicked()
{
#if 1
//第一种取消方法
QSqlDatabase::database().rollback();
#endif
#if 0
//第二种取消方法
QSqlDatabase db=QSqlDatabase::database();
if(db.isOpen()==true)
{
qDebug()<<"取消删除";
db.exec("rollback;");
}
#endif
#if 0
//第三种取消方法
QSqlQuery query;
query.exec("ROLLBACK");
#endif
}
//查找
void MyWidget::on_pushButton_clicked()
{
//查找
QSqlQuery query;
query.exec("select * from student where id<1006");
//一行一行遍历
while(query.next())
{
//取出当前行内容
qDebug()<<query.value(0).toInt()
<<query.value(1).toString()
<<query.value("age").toInt()
<<query.value("score").toInt();
}
}