Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-QTreeView和SQL-performanceadvice_C++_Sql_Qt - Fatal编程技术网

C++ Qt-QTreeView和SQL-performanceadvice

C++ Qt-QTreeView和SQL-performanceadvice,c++,sql,qt,C++,Sql,Qt,我有一个应用程序,我想在其中以层次结构显示SQL查询结果。我有一些基于工作的东西 当前创建树节点的代码的主要部分如下所示: void TreeModel::setupModelData(TreeItem *parent) { QList<TreeItem*> parents; QList<int> indentations; parents << parent; QList<QVariant> columnData;

我有一个应用程序,我想在其中以层次结构显示SQL查询结果。我有一些基于工作的东西

当前创建树节点的代码的主要部分如下所示:

void TreeModel::setupModelData(TreeItem *parent)
{
  QList<TreeItem*> parents;
  QList<int> indentations;
  parents << parent;     
  QList<QVariant> columnData;

  QVector<QString> vecFileNames = getFileNames();
  QVector<QString> vecTableNames = getTableNames();

  for(int i = 0; i < vecFileNames.size(); i++)
  {
    columnData.clear();
    columnData << vecFileNames[i];
    parents.last()->appendChild(new TreeItem(columnData, parents.last()));

    int childCount = parents.last()->childCount() - 1;
    parents << parents.last()->child(childCount);    //add the current parent's last child as a parent

    for(int j = 0; j < vecTableNames.size(); j++)
    {
      columnData.clear();
      columnData << vecTableNames[j];
      parents.last()->appendChild(new TreeItem(columnData, parents.last()));

      QVector<QString> vecTableValues = getTableValues(&vecTableNames[j]);
      int childCount = parents.last()->childCount() - 1;
      parents << parents.last()->child(childCount);         //add the current parent's last child as a parent

      for(int k = 0; k < vecTableValues.size(); k++)
      {
        columnData.clear();
        columnData << vecTableValues[j];
        parents.last()->appendChild(new TreeItem(columnData, parents.last()));
      }

    }
    parents.pop_back();
  }

}

QVector<QString> TreeModel::getFileNames()
{
  db.open();

  QVector<QString> vecFileNames;
  QSqlQuery query(db);
  QString strQuery = "SELECT PK_fileName FROM fileproperties";
  query.prepare(strQuery);

  if(query.exec() == true)
  {
    while(query.next())
    {
      vecFileNames.push_back(query.value(0).toString());
    }
  }

  db.close();
  return vecFileNames;
}
void TreeModel::setupModelData(TreeItem*parent)
{
QList父母;
QList缩进;
父母子女数()-1;
parents-child(childCount);//将当前父对象的最后一个子对象添加为父对象
对于(int j=0;jchildCount()-1;
parents-child(childCount);//将当前父对象的最后一个子对象添加为父对象
对于(int k=0;k
然而,检索2000个查询值的数据速度非常慢。
有人能为我现在使用的方法推荐另一种方法吗?

您应该实现函数haschilds()并使用。您基本上应该阅读这篇文章和文档(尤其是)。

对于MS SQL Server,我通常使用它将查询速度提高10倍

这种“转发”模式只是禁用行缓存,并强制sql驱动程序将所有结果作为一个fat回复请求,而不是将查询结果作为多个部分(一行或多行)获取

我发现了MS SQL Server 2005+2008有1000多万条条目的问题,在一个特殊的日子里,我只搜索了200-400条条目,以便使用QSqlTableModel在QTableView中显示它们

启用转发模式后,我的查询时间从10多秒增加到了200-300毫秒——在一个有1000多万条记录的数据库上

示例:

QSqlQuery query(database);
query.setForwardOnly(m_bForwardOnly);

query.exec(statement);
if ( query.lastError().isValid() || database.lastError().isValid() ) {
   ...evaluate the results...
}

我猜性能会受到分别插入2000个条目、触发2000个视图更新、可能2000个排序等的影响。。。您应该提供一种向模型中添加数据的方法,该方法将获取“批”项,并且只发出一次更改的信号…

将模型从视图中分离、更新,然后将其附加到视图可能会加快代码的速度。