QSqlQueryModel返回空结果

时间:2015-08-16 06:38:32

标签: sql sql-server database qt

代码:

queryModel = new QSqlQueryModel();
QSqlQuery sql;
QString strSql = "{CALL syllabi_output}";
sql.exec(strSql);
queryModel->setQuery(sql);
ui->tableView_4->setModel(queryModel);

标题存在,但没有行。

存储过程在Management Studio中正常工作(两行)。

2 个答案:

答案 0 :(得分:0)

查询是一个局部变量,一旦超出范围就会被破坏。您可能在方法或构造函数中调用它,因此在视图有可能对查询的数据执行任何操作之前,范围会很快结束。查询模型比查询更长,并且没有要提供的数据,因此视图显示为空。

相反,您应该同时保留模型和查询。例如:

class Widget : public QWidget {
  Q_OBJECT
  Widget::Ui ui;
  QSqlQueryModel m_model;
  QSqlQuery m_modelQuery;
  ...
public:
  void runQuery() {
    m_modelQuery.exec(QStringLiteral("{CALL syllabi_output}"));
    m_model.setQuery(m_modelQuery);
    ui.tableView_4->setModel(&m_model);
  }
  ...
};

如果查询总是很简单,并且您总是希望立即执行,则可以使用其他setQuery重载:

class Widget : public QWidget {
  Q_OBJECT
  Widget::Ui ui;
  QSqlQueryModel m_model;
  ...
public:
  void runQuery() {
    m_model.setQuery(QStringLiteral("{CALL syllabi_output}"));
    ui.tableView_4->setModel(&m_model);
  }
  ...
};

请注意,将ui或查询模型存储为指针并不重要。如果你坚持懒惰地实例化查询模型,你当然可以这样做:

class Widget : public QWidget {
  Q_OBJECT
  Widget::Ui ui;
  QPointer<QSqlQueryModel> m_model; // this is a non-owning pointer
  ...
public:
  void runQuery() {
    if (m_model.isNull()) m_model = new QSqlQueryModel(this);
    m_model->setQuery(QStringLiteral("{CALL syllabi_output}"));
    ui.tableView_4->setModel(&m_model);
  }
  ...
};

答案 1 :(得分:0)

我发现这试图解决类似的问题。除了Kubar提到的变量范围之外,还有一些其他Qt和SQL Server问题。

  • QSqlQueryModel只能与仅向前查询一起使用
  • 仅针对查询转发由数据库驱动程序确定。 setForwardOnly(false)只是一个建议
  • 默认情况下,SQL Server存储过程可能会返回多个(中间)结果集。

This answer from Qt Forum详细介绍。