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