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();
    }
View Code

 

posted @ 2020-12-09 17:45  笑不出花的旦旦  阅读(1008)  评论(0编辑  收藏  举报