由于QSqlQuery对象作用域而导致Qt数据库错误
我的问题是为什么我不能使用成员对象QSqlQuery而不是本地对象?您需要使用由于QSqlQuery对象作用域而导致Qt数据库错误,qt,scope,qtsql,Qt,Scope,Qtsql,我的问题是为什么我不能使用成员对象QSqlQuery而不是本地对象?您需要使用QSqlQuery(QSqlDatabase db)构造函数初始化QSqlQuery 为此,您需要在构造函数中使用初始化器列表,并且已经设置了DB连接,或者稍后使用指针初始化QSqlQuery 使用ABC构造函数获取初始化的数据库(在main中创建数据库): 或 您需要使用QSqlQuery(QSqlDatabase db)构造函数初始化QSqlQuery 为此,您需要在构造函数中使用初始化器列表,并且已经设置了DB连
QSqlQuery(QSqlDatabase db)
构造函数初始化QSqlQuery
为此,您需要在构造函数中使用初始化器列表,并且已经设置了DB连接,或者稍后使用指针初始化QSqlQuery
使用ABC
构造函数获取初始化的数据库(在main中创建数据库):
或
您需要使用
QSqlQuery(QSqlDatabase db)
构造函数初始化QSqlQuery
为此,您需要在构造函数中使用初始化器列表,并且已经设置了DB连接,或者稍后使用指针初始化QSqlQuery
使用ABC
构造函数获取初始化的数据库(在main中创建数据库):
或
那么,为什么本地对象不用db初始化就可以工作呢?它可以工作,因为在添加数据库后,它成为默认连接,因此此后创建的任何
QSqlQuery
都将使用它。当使用类属性时,QSqlQuery在创建默认db连接之前被实例化。那么为什么本地对象不使用db初始化就可以工作呢?它可以工作是因为添加数据库后,它成为默认连接,因此此后创建的任何QSqlQuery
都将使用它。使用类属性时,QSqlQuery在创建默认db连接之前被实例化。
#include <QtGui>
#include <QtSql>
#include <QApplication>
class ABC {
public:
QSqlDatabase db;
QSqlQuery memberQuery;
ABC() {
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test");
qDebug() << "Database open test : " << db.open();
}
void database() {
qDebug() << "Inside database method..." << endl;
QSqlQuery localQuery ;
qDebug() << "Using local Query : " << localQuery.exec("create table if not exists alu (ini int)");
localQuery.clear();
qDebug() << "Using memeber query object: " << memberQuery.exec("create table if not exists alu (ini int)");
memberQuery.clear();
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ABC ob;
ob.database();
return a.exec();
}
Database open test : true
Inside database method...
Using local Query : true
QSqlQuery::exec: database not open
Using memeber query object: false
ABC(QSqlDatabase _db) :
db(_db),
memberQuery(db)
{
Q_ASSERT(db.isOpen());
}
class ABC
{
QSqlDatabase db;
QSqlQuery* memberQueryPtr;
public:
ABC() : db(QSqlDatabase::addDatabase("QSQLITE")),memberQueryPtr(0)
{
db.setDatabaseName("test");
if (!db.open())
return;
memberQueryPtr = new QSqlQuery(db);
}
~ABC()
{
delete memberQueryPtr; memberQueryPtr = 0;
}
// ...
};