gpt4 book ai didi

c++ - QSqlTableModel 数据库连接问题

转载 作者:太空宇宙 更新时间:2023-11-04 13:09:44 25 4
gpt4 key购买 nike

阅读QSqlTableModel documentation我看到两种获取模型的方法:

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

QSqlTableModel model;

第二种情况选择了哪个数据库连接?此时我需要事件连接吗?

我尝试了第二种,使 QSqlTableModel 模型成为类成员。

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);

最佳答案

Which database connection is chosen in the second case?

选择默认数据库连接。 来自 QSqlTableModel's constructor documentation ,你可以看到,如果你不指定 db 参数,它将默认为 QSqlDatabase() (这是一个空的无效QSqlDatabase对象):

If db is not valid, the default database connection will be used.

默认连接是在调用QSqlDatabase::addDatabase()时定义的无需指定 connectionName 参数。


Do I need an active connection at this point?

两种形式都需要模型使用有效的数据库连接。你可以看看 Table Model Example有关如何使用该类的示例。

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


Should I, instead, do (in the body of the slot - not making model a class member)?

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

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

这两种方法都应该可以完成工作。选择一个而不是另一个与 select() 调用失败无关。就个人而言,如果不是真的需要,我宁愿避免动态分配。你可以看看this question进行类似的比较。


model.select() returns false

以下是一些可能有助于解决问题的建议:

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

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

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

    qDebug() << model.lastError();

关于c++ - QSqlTableModel 数据库连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40474851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com