20、qt中数据库操作
1、操作常见mysql数据库,qtcreator中并没有自带mysql库,以及环境,需要自己添加,可查看qt添加mysql那篇文章;由于没有安装数据库图形化操作软件,因此这里使用
命令cmd黑窗口操作;
2、打开黑窗口进入单mysqll的安装目录下,并登录
3、连接数据库
qDebug() << QSqlDatabase::drivers(); // 打印默认支持的数据库驱动 // 添加数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 连接数据库 db.setHostName("127.0.0.1"); // 数据库服务器IP地址 在本机上安装的数据库 db.setUserName("root"); // 登录mysql的用户名 -->mysql -u root -p中的用户名 db.setPassword("123456"); // 登录密码 db.setDatabaseName("mydata"); // 使用的哪一个数据库 --->show databases; 查看可用的数据库,或者创建数据库 // 打开数据库 if(!db.open()) { qDebug() << "打开数据库失败"; return; }
查看现有的数据库
使用mydata数据库,use mydata;
4、数据库中创建一个表格
// 创建一个对象,用于操作mysql的sql语句,实现操作mysql QSqlQuery query; // 创建表格student query.exec("create table student(id int primary key auto_increment,name varchar(255),age int, score int);");
这里使用的QSqlQuery对象使用mysql语句,简介操作数据库;
5、往表格中批量插入数据
批量插入数据,方法1
// 批量插入数据 // obdc风格; // 预处理语句 // ? 相当于占位符 query.prepare("insert into student(name,age,score) values(?,?,?)"); // 使用这条sql语句,实现插入数据,这里使用占位符号实现批量插入数据 // 给字段设置内容 QVariantList nameList; nameList<<"LiHua"<< "XiaoMing"<<"Liuwei"; QVariantList ageList; ageList << 21<< 23<< 24; QVariantList scoreList; scoreList << 76<< 68<< 85; // 给字段绑定相应的值 按顺序绑定,否则失败 query.addBindValue(nameList); query.addBindValue(ageList); query.addBindValue(scoreList); // 执行预处理命令 query.execBatch();
批量插入数据,方法2
// 批量插入数据 // oracle风格 // 站位符 :+自定义名字 query.prepare("insert into student(name,age,score) values(:name,:age,:score)"); // 字段设置内容 QVariantList nameList; nameList<< "小白"<< "乐乐"<< "欢欢"; QVariantList ageList; ageList << 43<< 45<< 44; QVariantList scoreList; scoreList << 56<< 75<< 84; // 字段绑定内容 与绑定顺序无关 query.bindValue(":name", nameList); query.bindValue(":score",scoreList ); query.bindValue(":age",ageList); // 执行预处理命令 query.execBatch();
插入数据完成后,查询下,刚才插入的数据
6、数据事物:
在执行数据库操作之前,比如插入、删除等操作之前,可以先创建一个事务,事务以后的删除、插入等操作可以恢复到操作之前的状态;
// 删除数据 void Widget::on_btnDel_clicked() { QString name = ui->lineEdit->text(); QString sql = QString("delete from student where name = '%1'").arg(name); // 开启一个事物,事物以后的操作都可以撤消 QSqlDatabase::database(); // 获取数据库 db.transaction(); // == QSqlDatabase::database().transaction(); QSqlQuery query; query.exec(sql); // 删除数据 }
// 确认删除 void Widget::on_btnSure_clicked() { // 确认删除 db.commit(); }
// 撤消删除数据 void Widget::on_btnCancel_clicked() { // 回滚 ,撤消删除的数据 QSqlDatabase::database(); // 获取数据库 db.rollback(); // 这里语句执行成功,但是数据回复失败,在命令行下删除、撤消数据都可以 }
在命令行下册数数据库事务:
select * from student; // 查看student表中的所有数据 start transaction; // 开启一个事务 delete from student where name ="乐乐"; // 删除表中的数据 rollback; // 回滚,撤消数据
7、数据库遍历
query.exec("select * from student"); //query.exec("select * from student where id = '12'"); // 加过滤 while(query.next()) // 一行一行遍历表格 { qDebug() << query.value(0).toInt() << query.value("name").toString() << query.value("age").toUInt() << query.value("score").toInt(); }
Sqlite数据库操作:
1、创建一个数据库文件info.db,是一个开源的静态的数据库,qt自带有支持;
静态数据库操作:
db = QSqlDatabase::addDatabase("QSQLITE"); // 添加数据库 db.setDatabaseName("info.db"); // 设置数据库名称 // 打开数据库 if(!db.open()) { return; } QSqlQuery query; // 创建表格 query.exec("create table student(id int primary key,name varchar(255),age int, score int)"); // 批量插入数据 // obdc风格; // 预处理语句 // ? 相当于占位符 query.prepare("insert into student(name,age,score) values(?,?,?)"); // 给字段设置内容 QVariantList nameList; nameList<<"LiHua"<< "XiaoMing"<<"Liuwei"; QVariantList ageList; ageList << 21<< 23<< 24; QVariantList scoreList; scoreList << 76<< 68<< 85; // 给字段绑定相应的值 按顺序绑定,否则失败 query.addBindValue(nameList); query.addBindValue(ageList); query.addBindValue(scoreList); // 执行预处理命令 query.execBatch(); query.exec("select * from student"); while(query.next()) { qDebug() << query.value(0).toInt() << query.value("name").toString() << query.value("age").toUInt() << query.value("score").toInt(); }