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

来源:互联网 发布:战舰世界数据更新出错 编辑:程序博客网 时间:2024/05/16 01:01

继上篇文章将数据库封装成一个类,链接为成员函数,而当我将查询做为另一个函数时,无法对已有的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();
0 0