Qt操作数据库模式之一QSqlQueryModel

  • Qt操作数据库的几个层次
  • 1、Qt SQL模块简介
  • 2、驱动层
  • 3、SQL接口层
  • 4、用户接口层
  • 5、数据库操作抽象层级
  • 创建数据库
  • 查询记录
  • 条件查询1
  • 条件查询--时间范围


Qt操作数据库的几个层次

1、Qt SQL模块简介

QT通过Qt SQL模块提供了对SQL数据库的支持,Qt SQL模块中的API分为三层:驱动层、SQL接口层、用户接口层。
如果要使用Qt SQL模块中的类,需要在工程文件(.pro文件)中添加QT += sql代码。

2、驱动层

驱动层为具体的数据库和SQL接口层之间提供了底层的桥梁,主要类包括Qt SQL模块中的QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin和QSqlResult。

3、SQL接口层

SQL接口层提供了对数据库的访问,主要类包括Qt SQL模块中的QSqlDatabase、QSqlQuery、QSqlError、QSqlField、QSqlIndex和QSqlRecord。QSqlDatabase类用于创建数据库连接,QSqlQuery用于使用SQL语句实现与数据库交互。

4、用户接口层

用户接口层主要包括Qt SQL模块中的QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel。用户接口层的类实现了将数据库中的数据链接到窗口部件上,是使用模型/视图框架实现的,是更高层次的抽象,即便不熟悉SQL也可以操作数据库。需要注意的是,在使用用户接口层的类之前必须先实例化QCoreApplication对象。

5、数据库操作抽象层级

  1. SQL语句直接操作,对应于QSqlQuery,这种操作下,直接构造sql语句,通过exec、execBatch、QRecord等操作获取结果;
  2. 只读模式的QSqlQueryModel,这种操作下,可以与 QTableView视图结合,自动显示操作结果;
  3. 更高抽象层次下的QSqlTableModel、QSqlRelationalTableModel,在QSqlQueryModel模式下,如果不重载SetData等方法,QTableView视图中的记录是无法编辑的,而QSqlTableModel、QSqlRelationalTableModel就是封装了视图记录可以编辑的方法。

创建数据库

查询记录

bool MainWindow::dbCreate(QString tableName)
{
    QStringList drivers = QSqlDatabase::drivers();
    foreach (QString str, drivers) {
        qDebug() << str;
    }
    //创建数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "mydb1");
    db.setDatabaseName(".//xyzDb.db"); //创建数据库
    if (!db.open()){
        qDebug() << "add database error:" << db.lastError();
        return false;
    }
    //先判断对应的表是否存在,若不存在则创建对应的表
    QSqlQuery query(db);
    QStringList tables = db.tables();
    if (! tables.contains(tableName, Qt::CaseInsensitive)){
        bool Flag = query.exec(QString("create table '%1'(id int primary key,time varchar(30),xdata double,ydata double,zdata double)").arg(tableName));
        if (Flag){
            qDebug() << QObject::tr("create table success!\n");
            return true;
        }
        else {
            qDebug() << QObject::tr("create table  failed\n");
            return false;
        }
    }
    //注意 ‘%1’  单引号不要少  tablename可以是中文
    return true;
}

条件查询1

void MainWindow::on_pBtnFilter_clicked()
{
    QString str = ui->lineEditName->text();
    QSqlDatabase db = QSqlDatabase::database("mydb1");

    QSqlQueryModel *model = new QSqlQueryModel;

    QString sqlStr = QString("select *from student where name = '%1'").arg(str);
    model->setQuery(sqlStr, db);
    ui->tableView->setModel(model);
}

条件查询–时间范围

void MainWindow::on_pBtnSelect_clicked()
{
    QString strDateTimeFrom = ui->dateTimeEdit_From->dateTime().toString("yyyy-MM-dd HH:mm:ss");
    QString strDateTimeTo = ui->dateTimeEdit_To->dateTime().toString("yyyy-MM-dd HH:mm:ss");

    QSqlDatabase db = QSqlDatabase::database("mydb1");

    QSqlQueryModel *model = new QSqlQueryModel;

    QString sqlStr = QString("select * from xyzdata where time >= '%1' and time <= '%2'").arg(strDateTimeFrom).arg(strDateTimeTo);
    model->setQuery(sqlStr, db);
    ui->tableView->setModel(model);

}