QtCreator Qt中执行SQL语句,select,update,delete,insert

本文介绍如何使用Qt的QSqlQuery类进行数据库操作,包括执行查询、浏览结果集、插入更新删除记录及事务处理等内容。

1 执行一个查询

发生错误后,QSqlQuery::exec()会返回false,错误信息在query.lastError()中

    //创建数据库连接
    if (!createConnection()) return 1;
QSqlDatabase db1 = QSqlDatabase::database("connection1");

    //使用QSqlQuery查询整张表
    QSqlQuery query1(db1);
    qDebug() << "connection1:";
    query1.exec("select * from student");

    //显示错误信息
    qDebug() << query1.lastError().text() ;
2 浏览结果集

    query1.exec("select * from student");
    while(query1.next()) {
        qDebug() << query1.value("id").toInt() << "," << query1.value("name").toString();
    }

QSqLQuery::value()可以返回当前记录的一个字段。返回一个QVariant,后面toInt(),toString()将其转换成相应类型

next()定位到下一条记录,

previous()前一条记录,

first()第一条纪律

last()定位到最后一条记录

seek(n)定位到第n条记录

at()返回当前行的索引

record()返回当前行的记录

size()返回总行数,通过QSqlDriver::hasFeature()判断是否支持

    int numRows;
    //判断是否支持QuerySize特性
    if (db1.driver()->hasFeature(QSqlDriver::QuerySize)) {
        qDebug() << "支持size()" << endl;
        numRows = query1.size();
    } else {
        qDebug() << "不支持size()" << endl;
        query1.last();
        numRows = query1.at()+1;
    }

    query1.seek(2);    //指向索引为2的记录,即第3条记录
    qDebug() << "当前记录:" <<query1.at() << endl;// 返回索引值
    qDebug() << "id:" << query1.value(0).toInt() << ",name" << query1.value(1).toString();
    qDebug() << "id:" << query1.value("id").toInt() << ",name:" << query1.value("name").toString();

    QSqlRecord record = query1.record();//获取当前行的记录
    //获取记录中"id"和"name"两个字段的值
    qDebug() << "id:" << record.value("id").toInt() << ",name:" << record.value("name").toString();

    //获取索引为1的字段,输出字段名与,值
    QSqlField field = record.field(1);
    qDebug() << "fieldName:" << field.name() << ",fieldValue:" << field.value().toString();
3 插入,更新和删除记录

Qt支持两种占位符:名称绑定和位置绑定

    //名称绑定
    query1.prepare("insert into student values(:id,:name)");
    int idValue = 10;
    QString nameValue = "ChenYun";
    query1.bindValue(":id",idValue);
    query1.bindValue(":name",nameValue);
    qDebug() << query1.exec();
    //位置绑定
    query1.prepare("insert into student values(?,?)");
    idValue = 20;
    nameValue = "chenchen";
    query1.addBindValue(idValue);
    query1.addBindValue(nameValue);
    query1.exec();

    // 批处理
    query2.prepare("insert into student (id, name) values (?, ?)");
    QVariantList ids;
    ids << 20 << 21 << 22;
    query2.addBindValue(ids);
    QVariantList names;
    names << "xiaoming" << "xiaoliang" << "xiaogang";
    query2.addBindValue(names);
    if(!query2.execBatch()) qDebug() << query2.lastError();

    // 更新
    query2.exec("update student set name = 'xiaohong' where id = 20");
    // 删除
    query2.exec("delete from student where id = 21");

    query2.exec("select * from student");
    while(query2.next())
    {
        qDebug() << query2.value(0).toInt() << query2.value(1).toString();
    }

4 事务

QSqlDatabase::transaction()//启动一个事务

QSqlDatabase::commit()//结束一个事务

QSqlDatabase::rollback()//数据回滚

    tableModel->database().transaction();
    if (tableModel->submitAll()) {
        tableModel->database().commit();
    } else {
        tableModel->database().rollback();
        QMessageBox::warning(this,"tableModel",QString("数据库错误:%1").arg(tableModel->lastError().text()));
    }




Qt SQL中,可以使用QSqlQuery来执行数据库删除操作。具体的删除语句可以通过qry.exec()方法传入一个字符串,包含要执行SQL语句。例如,可以使用以下代码删除名为"Sys_user"表中满足给定条件的记录: QSqlQuery qry(db); qry.exec(QString("delete from Sys_user where name = '%1' and password = '%2';").arg(res1).arg(res2)); 这段代码中,res1和res2是要匹配的条件值。同样的方式也可以用来删除其他表中的记录,只需修改表名和条件。 另外,当执行数据库删除操作后,已删除的记录所占用的内存并不会自动释放,而是保留为碎片。为了释放这些碎片空间,可以使用vacuum功能。例如,可以像以下代码一样在删除操作后执行vacuum: QSqlQuery qry(db); qry.exec("vacuum"); 执行vacuum操作后,被删除记录所占用的内存碎片将被释放,数据库文件的大小也会相应变小。 总结起来,Qt SQL中的删除操作可以通过QSqlQuery的exec()方法执行SQL语句来实现,同时可以使用vacuum功能释放删除操作所占用的内存碎片。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [qtsql删除间隔大量数据](https://blog.youkuaiyun.com/qq_37603131/article/details/104131769)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [QtCreator Qt执行SQL语句,select,update,delete,insert](https://blog.youkuaiyun.com/psujtfc/article/details/38057421)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值