Qt5之数据库操作笔记(二)

来源:互联网 发布:已备案域名靠谱吗 编辑:程序博客网 时间:2024/06/16 02:44

接Qt5之数据库操作笔记(一)。
从上一篇笔记中我们知道,Qt5中打开数据库就是要打开该数据库的连接,所以事先要设置连接名。如果不设置连接名,则使用默认连接名。如果在应用程序中只需要有一个数据库连接,那么使用默认连接是很方便的。创建一个连接就是创建了一个QSqlDatabase类的实例,而且,直到该连接被打开以前,它都是没有被使用的。

1. QSqlQuery类的简单使用

包含以下头文件:

#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlError>#include <QDebug>#include <QSqlRecord>#include <QSqlIndex>#include <QSqlField>

主函数中运行如下代码:

    //创建数据库连接,设置数据库路径,并且通过该连接名打开数据库    QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");    QString dbpath = QCoreApplication::applicationDirPath();    db1.setDatabaseName(dbpath + "/" + "db1.db");    if(!db1.open())    {        qDebug() << db1.lastError();    }    else    {        qDebug() << "connect to db1.db";    }    //使用 QSqlQuery 类的对象来访问数据库    QSqlQuery query(db1);//指定 query 访问的连接是 connection1                         //PS:当存在多个连接时,使用 QSqlQuery 就要指定使用的是哪个连接,                         //这样才能在正确的数据库上进行操作    //创建 student 表, 表中有 id, name, student_id 三个字段    query.exec("create table student (id int primary key,"               "name varchar(20), student_id varchar(10))");//调用 exec() 执行 Sql 语句    //往 student 表中插入数据    query.exec("insert into student values(1, '小白', '16721810')");    query.exec("insert into student values(2, '大白', '16721811')");    query.exec("insert into student values(3, '小黑', '16721812')");    query.exec("insert into student values(4, '大黑', '16721813')");    //执行一个查询    query.exec("select * from student");    //使用 next() 遍历结果集    while(query.next())    {        qDebug() << query.value(0).toInt() << query.value(1).toString()                 << query.value(2).toString();//打印 student 表中所有记录        //QSqlQuery::value() 函数可以返回当前记录的一个字段值        //比如value(0)就是第一个字段的值,各个字段从0开始编号        //该函数返回一个 QVariant,不同的数值库类型会自动映射为Qt中最接近的相应类型,        //这里的 toInt() 和 toString() 就是将 QVariant 转换为 int 和 QString 类型    }    //使用 last() 定位到最后一条记录    query.last();    //返回并打印当前记录的索引值    qDebug() << "current index:" << query.at();    //获取当前行的记录    QSqlRecord record = query.record();    //获取记录中的"id","name","student_id"两个字段的值    int id = record.value("id").toInt();    QString name = record.value("name").toString();    QString student_id = record.value("student_id").toString();    qDebug() << "id:" << id << "name:" << name << "student_id:" << student_id;    //获取记录中的索引为1的字段,即第二个字段    QSqlField field = record.field(1);    qDebug() << field.name() << field.value().toString();//打印    //使用 prepare(), bindValue(), exec() 插入多个字段(使用了名称绑定)    query.prepare("insert into student(id, name, student_id) values(:id, :name, :stuid)");    int idvalue1 = 5;    QString namevalue1 = "小蓝";    QString studentidvalue1 = "16721814";    query.bindValue(":id", idvalue1);    query.bindValue(":name", namevalue1);    query.bindValue(":stuid", studentidvalue1);    query.exec();    //使用 prepare(), addbindValue(), exec() 插入多个字段(使用了位置绑定)    query.prepare("insert into student(id, name, student_id) values(?, ?, ?)");    int idvalue2 = 6;    QString namevalue2 = "大蓝";    QString studentidvalue2 = "16721815";    query.addBindValue(idvalue2);    query.addBindValue(namevalue2);    query.addBindValue(studentidvalue2);    query.exec();    //使用 prepare(), addbindValue(), execBatch() 批处理插入多条记录(使用了位置绑定)    query.prepare("insert into student(id, name, student_id) values(?, ?, ?)");    QVariantList ids;    ids << 7 << 8;    query.addBindValue(ids);    QVariantList names;    names << "小红" << "大红";    query.addBindValue(names);    QVariantList stuids;    stuids << "16721816" << "16721817";    query.addBindValue(stuids);    query.execBatch();    //更新如果执行成功,则你会发现数据库中的id=1处的字段更新了    query.exec("update student set name = '小小白', student_id = '16721800' where id = 1");    //删除,如果执行成功,则你会发现数据库中的id=5处记录没有了    query.exec("delete from student where id = 5");

2. 总结

使用QSqlQuery类来访问数据库其实也很轻松。当然Qt还提供了3个更高级的类来访问数据库,分别是QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。有兴趣的话可以去尝试。当遇到不懂的函数时,看Qt的说明文档真的很有用。在Qt Creator中按F1进入该函数的说明文档,按F2进入该函数所在的头文件。

0 0
原创粉丝点击