Qt 连接、操作数据库(增删改查)

Qt 5.9连接MySQL5.7(32/64位)

  • MySQL5.7安装好后将其安装路径lib下 libmysql.dlllibmysqld.dll 两个动态链接库文件复制到Qt 相应编译环境(我用的mingw53_32)安装目录bin下即可

  • 注:因为QT的mingw编译器是32位的,如果安装的MySQL是64位的话需将上面那个libmysql.dll替换为此libmysql.dll ( 提取码:m9iz)

  • 远程连接数据库配置:需关闭防火墙、停用开机密码,然后用命令提示符进入数据库执行以下SQL语句即可(如何执行?

    use mysql;
    grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
    
  • 测试

    #.pro
    QT  += sql widgets
    
    //.cpp
    #include "mainwindow.h"
    #include <QApplication>
    #include <QtSql/QSqlDatabase>
    #include <QSqlQuery>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
        db.setHostName("127.0.0.1"); //此为本地连接,可设主机IP
        db.setPort(3306);
        db.setDatabaseName("cpp_info"); //数据库名
        db.setUserName("root");
        db.setPassword("******"); //数据库密码
        if(db.open())
        {
            qDebug()<<"数据库连接成功!!!";
        }
        
    	/*操作数据库*/
    	
        return a.exec();
    }
    

操作数据库(QSqlQuery类)

执行SQL语句(查)

  • 以查询为例
    	QSqlQuery query(db); //此处db对象为上文使用QSqlDatabase类连接MySQL所创建
    	query.exec("select * from data"); //查询data表
    

浏览结果集方法

  • 执行完exec()后,QSqlQuery的内部指针将位于第一条记录前面的位置(需调用一次next()函数将指针指向下一条也就是第一条记录)
    	//查询data表后
        //定位到
        query.next(); //下一条记录索引,如果下一条记录不存在时则返回false,以下函数同理不存在返回false
        query.previous(); //上一条
        query.first(); //第一条
        query.seek(index); //第index条
        query.last(); //最后一条
        
        //记录
        query.record(); //返回当前指向的记录
        query.at(); //返回当前记录的索引
        query.size(); //返回结果集的总条数
        
        //字段
        query.value(n); //返回当前内部指针指向的记录的一个字段值,索引(n)从0开始  
    

增、删、改

  • 直接增加(插入)

    	//方法一
        query.exec("insert into data(account,password) values('user', 'xxxxxx')");
    
  • 使用占位符(名称绑定、位置绑定)

    	//方法二(名称绑定) 
        QString account = "user", password = "xxxxxx";
        query.prepare("insert into data(account,password) values(:account, :password)");    
        query.bindValue(":account", account);
        query.bindValue(":password", password);
        query.exec(); //执行
    	
    	//方法三(位置绑定)
        QString account = "user", password = "xxxxxx";
        query.prepare("insert into data(account,password) values(?, ?)");
        query.addBindValue(account);
        query.addBindValue(password);
        query.exec(); //执行
    
  • 增加多条记录(方法一、二皆可)

        QVariantList account_list, password_list; //创建两个可以存储任意类型的列表对象
        account_list << "user_1" << "user_2";
        password_list << "111111" << "222222";
        
    	//方法一:名称绑定
        query.prepare("insert into data(account,password) values(:account, :password)");
        query.bindValue(":account", account_list);
        query.bindValue(":password", password_list);
        
    	//方法二:位置绑定
        query.prepare("insert into data(account,password) values(?, ?)");
        query.addBindValue(account_list);
        query.addBindValue(password_list);
        
        query.execBatch(); //批处理执行,若出错返回false,可用lastError()返回错误信息,需#include<QSqlError> 
    
    
  • 删除

    	query.exec("delete from data where account = 'user'"); //删除user所对应的记录
    
  • 修改(更新)

    	query.exec("update data set account = 'user_new' where account = 'user'");
    
  • 注:删除和修改亦可使用占位符,和增加类似,就不做介绍了

事务

事务可以保证复杂操作的原子性,即对于一个数据库操作序列,这些操作要么全部做完,要么一条也不做,它是一个不可分割的工作单位,流程如下

  • 使用QSqlDatabase::transaction() 来启动一个事务(必须在创建QSqlQuery的对象以前使用)
  • 使用QSqlQuery类执行SQL语句
  • 调用QSqlDatabase::rollback() 回滚 或是 调用QSqlDatabase::commit() 提交事务

参考书籍:Qt Creator快速入门(第三版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值