QSqlTableModel数据库连接问题

QSqlTableModel database connection issue

本文关键字:问题 数据库连接 QSqlTableModel      更新时间:2023-10-16

阅读QSqlTableModel文档,我看到了获取模型的两种方法:

QSqlTableModel *model = new QSqlTableModel(parentObject, database);

QSqlTableModel model;

在第二种情况下选择哪个数据库连接?我现在需要一个活动连接吗?

我尝试了第二种方法,让QSqlTableModel model成为班级成员。

class MyClass {
    QSqlTableModel model;
public:
    MyClass(){}
public slots:
    onDbConnected(){
        model.setTable("employee");
        bool b = model.select();  
    }
};

但是model.select()以这种方式返回false

我是否应该这样做(在槽的主体中-不使模型成为类成员)?

 QSqlTableModel *model = new QSqlTableModel(parentObject, database);

在第二种情况下选择哪个数据库连接?

选择默认的数据库连接。QSqlTableModel的构造器文档中,您可以看到,如果您不指定db参数,它将默认为QSqlDatabase()(这是一个空的无效QSqlDatabase对象):

如果db无效,将使用默认的数据库连接。

在不指定connectionName参数的情况下调用QSqlDatabase::addDatabase()定义默认连接。


此时是否需要一个活动连接?

两个表单都需要一个有效的数据库连接来供模型使用。您可以查看表模型示例,以获得如何使用该类的示例。

通常,必须在应用程序启动时设置数据库连接。之后,您可以在任何QSqlQuery/QSqlQueryModel/QSqlTableModel中使用此连接…


我是否应该这样做(在槽的主体中-不使模型成为类成员)?

如果您的目标只是将参数传递给成员对象的构造函数,则不需要动态分配对象。这是一个通用的c++连接,你可以在MyClass的构造函数中传递任何你需要的参数:

class MyClass {
    QSqlTableModel model;
public:
    MyClass(): model(this, QSqlDatabase::database("mydbconnection")){}
...

两种方法都可以。选择其中一个而不是另一个并不需要与select()调用失败做任何事情。就我个人而言,如果真的不需要动态分配,我宁愿避免它。你可以看一下这个问题,做一个类似的比较。


model.select()返回false

这里有一些建议可以帮助解决这个问题:

  1. 在构建QSqlTableModel之前检查数据库连接是否为open()

  2. 检查您在setTable()中没有提供错误的表名

  3. 您可以使用model.lastError()获取有关错误的更多信息。

    qDebug() << model.lastError();