Qt开发,链接了数据库后,调用QSqlQuery::setQuery执行SQL语句获取我们想要的数据

时间:2023-02-16 13:58:53

继上篇文章将数据库封装成一个类,链接为成员函数,而当我将查询做为另一个函数时,无法对已有的database进行操作,尽管db为类的成员,同样会报错误:QSqlQuery:exec: database not open

QSqlQueryModel* SqlClass::OpenDatabase()
{
    db = &QSqlDatabase::addDatabase("QODBC","xxx");
    if( !db->isValid() )
    {
        qDebug() << db->lastError().text();
    }
    db->setHostName();
    db->setDatabaseName();
    db->setUserName();
    db->setPassword();

    if(!db->open())
    {

    }
    else
    {

    }

    QSqlQueryMode *QueryModel;
    QueryModel = new QSqlQueryModel();
    QueryModel->setQuery(tr(""),*db);
    return QueryModel;
}

这里将model传出来,可调用QTableView->setModel(QueryModel);去讲数据提取。

关于SqlClass,本身就有db成员,为什么当我们setQuery语句不加入*db,即使跟db的创建放在同个函数里同样都有问题。这里已经违背了连接数据库跟操作数据库分开的初衷。

继续加油解决。

```````````````````````````````````````````````````````````````````OK
这里对问题重新理清了下思路,将数据库操作分开写在其他函数是可行的,而我原本的函数代码是这样的:

QSqlQueryModel* SqlClass::query_mod_cat()
{
    if( !db->open() ){
        qDebug()<<"Cannot connect to database.";
        return NULL;
    }
    QSqlQueryModel* query_model = new QSqlQueryModel();
    query_model->setQuery(tr("SELECT * FROM xxx"),db);
    return query_model;
}

出问题的点在于:
void QSqlQueryModel::setQuery(const QString &query,const QSqlDatabase &db = QSqlDatabase() )
这是setQuery的原型,所以一开始的思路是对的,给该query语句制定db,但是这里最大的问题不知道各位看出来了没。
我们需要传递的db类型是 const QSqlDatabase &db.
所以我在setQuery前加了:

const QSqlDatabase &database = *db;

然后再把我们的database传入:

query_model->setQuery(tr("SELECT * FROM xxx"),database);

这样就实现了链接跟操作分离,接下来我们传出的是model,比如想将其以table的形式展现出来:

QTabelView* Table_Select = new QTableView();
Table_Select->setModel(query_model);
Table_Select->show();