• qt中的数据库操作和数据库的加密存储(SQLite三)


    一、qt中的数据库操作

    1. Qt中加入sql数据库模块

    QT += sql
    
    • 1

    在这里插入图片描述

    2.添加并且连接数据库

    (1)添加数据库

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
       qDebug()<<"add sql error";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    static QSqlDatabase addDatabase(const QString& type,/*要连接的数据库驱动名称*/
                                    const QString& connectionName = QLatin1String(defaultConnection));/*数据库连接名称*/
    
    • 1
    • 2

    如果要连接多个数据库,那么connectionName就要自己指定

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
       qDebug()<<"add sql error";
    }
    QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE""hqd_test");
    db2.setDatabaseName(":memory:");
    if (!db2.open()) {
       qDebug()<<"add sql error";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (2)连接数据库

    QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);只要数据连接并且打开,后期可以在Qt工程中任意位置都可以使用(单例),在创建执行对象QSqlQuery会自动去绑定对应的数据

    QSqlQuery query;//默认绑定默认连接名的数据库
    query.exec("insert into test values(1)");
    
    • 1
    • 2
    //可以通过connectionName获取数据库"hqd_test"
    QSqlQuery queryHqd(QSqlDatabase::database("hqd_test"));
    queryHqd.exec("insert into test values(100)");
    
    • 1
    • 2
    • 3

    3.打开数据库并且通过QSqlQuery执行sql语句

    QSqlQuery query;
    query.exec(创建表格/更新/删除/等sql语句);
    
    • 1
    • 2

    例:

    QString  value = ui->lineEdit->text();
    QSqlQuery query;//默认绑定默认连接名的数据库
    QString sqlStr = QString("insert into test values(%1)").arg(value);
    if(!query.exec(sqlStr))
    {
       qDebug()<<"insert error";
       qDebug()<<query.lastError().text();//获取最后一条错误记录
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4. QSqlQuery查询操作

    在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的操作有:

    seek(int n) :query指向结果集的第n条记录;
    first() :query指向结果集的第一条记录;
    last() :query指向结果集的最后一条记录;
    next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;
    previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;
    record() :获得现在指向的记录;
    value(int n) :获得属性的值。其中n表示你查询的第n个属性,
    at() :获得现在query指向的记录在结果集中的编号。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例:

    QString select = "select * from password";
    QString select_where = QString("select * from password where username='%1' and password='%2'")
            .arg(ui->userEdit->text()).arg(ui->passEdit->text());
    
    QSqlQuery query;
    if(!query.exec(select_where))
    {
        qDebug()<<query.lastError().text();
    }
    //获取查询的数据
    if(query.next())
    {
        qDebug()<<"有数据";
        ui->label->setText("验证通过");
    }else {
        qDebug()<<"无数据";
        ui->label->setText("验证失败");
    }
    
    while(query.next())
    {
        QSqlRecord record = query.record();
        qDebug()<<record.value(1).toString()<<record.value(2).toString();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5. QSqlQuery类数据绑定

    QSqlQuery query;
    //这里的(:id,:name)可以用(?,?)) 代替) 
    //注意与sqlte3 API接口里面的绑定区别
    query.prepare("insert into student (id, name)  values (:id, :name)");
    query.bindValue(0, 5);  //序号从0开始,API接口里面的绑定区别1开始 sqlite3_bind_int
    query.bindValue(1, "sixth");//sqlite3_bind_text
    query.exec();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6. QSqlQuery批处理操作

    QSqlQuery q;
    query.prepare("insert into student values (?, ?)");
    QVariantList ints;
    ints << 10 << 11 << 12 << 13;
    query.addBindValue(ints);
    QVariantList names;
    names << "AAAA" << "BBBB" << "CCCC" << QVariant(QVariant::String);//这里加个空,与前面个数一致
    query.addBindValue(names);
    query.execBatch()) //进行批处理,如果出错就输出错误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Qt中数据库QSqlDataBase不能跨线程

    7.事务处理

    QSqlDatabase::transaction()  创建事务 BEGIN
        QSqlDatabase::database().transaction(); //开启事务
    QSqlDatabase::commit() 提交事务       COMMIT
        QSqlDatabase::database().commit();
    QSqlDatabase::rollback() 事务回滚     ROLLBACK
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二、Qt数据库实现用户名密码登录, 密码数据加密

    文件传输–>生成文件MD5码,与文件同时发送

    密码加密—>生成MD5, sha1, sha256, sha512

    MD5码是一个32位的十六进制数

    QCryptographicHash

    1.第一种方式

    (1)创建QCryptographicHash 对象–要指定加密方式

    QCryptographicHash  mdHash(加密方式)
    • 1

    (2)添加要加密的数据 addData

    mdHash.addData(要加密的数据)
    
    • 1

    (3)获取加密数据result

    QByteArray array = mdHash.result();
    
    • 1

    (4)把array转为十六进制

    QString pwd = array.toHex();
    
    • 1

    2.第二种方式

    static QByteArray hash(const QByteArray &data, Algorithm method);
    
    • 1
    参数:data --- 要加密的数据
         method --- 加密方式
    
    返回值:加密后的数据
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Lucene-MergePolicy详解
    【C语言趣味教程】(1) 深入浅出 HelloWorld:通过 HelloWorld 展开教学 | 头文件详解 | main 函数详解
    springboot+springsecurity+elementui博客系统-dsblog
    记一次【RabbitMQ集群网络分区】的问题,以及网络分区时的影响范围和如何恢复
    面向对象
    【C++】继承 ⑪ ( 多继承 | 多继承语法 | 多继承案例 )
    【无标题】
    关于SQL优化
    k8s--基础--29.1--ingress--介绍
    @Async
  • 原文地址:https://blog.csdn.net/LCHONSEONE/article/details/125385000