【问题标题】:QSqlRelationalTableModel - insert record greater than 256QSqlRelationalTableModel - 插入大于 256 的记录
【发布时间】:2014-06-20 00:47:06
【问题描述】:

我在 SQLite 数据库中有一个表 node={id,name} 和一个表 segment={id,nodeFrom,nodeTo},其中 node.id和 segment.id 是 AUTOINCREMENT 字段。

我正在为Node创建一个QSqlTableModel,如下:

nodeModel = new QSqlTableModel(this,db);
nodeModel->setTable("Node");
nodeModel->setEditStrategy(QSqlTableModel::OnFieldChange);

我使用以下代码插入节点:

int addNode(QString name) {
    QSqlRecord newRec = nodeModel->record();
    newRec.setGenerated("id",false);
    newRec.setValue("name",name);
    if (not nodeModel->insertRecord(-1,newRec))
        qDebug() << nodeModel->lastError();
    if (not nodeModel->submit())
        qDebug() << nodeModel->lastError();
    return nodeModel->query().lastInsertId().toInt();
}

这似乎有效。现在,对于段,我定义了一个 QSqlRelationalTableModel,如下所示:

segModel = new QSqlRelationalTableModel(this,db);
segModel->setTable("Segment");
segModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
segModel->setRelation(segModel->fieldIndex("nodeFrom"),
                                QSqlRelation("Node","id","name"));
segModel->setRelation(segModel->fieldIndex("nodeTo"),
                                QSqlRelation("Node","id","name"));

然后我有以下用于插入段的代码:

int addSegment(int nodeFrom, int nodeTo) {
    QSqlRecord newRec = segModel->record();
    newRec.setGenerated("id",false);
    newRec.setValue(1,nodeFrom);
    newRec.setValue(2,nodeTo);
    if (not segModel->insertRecord(-1,newRec))  // (*)
        qDebug() << segModel->lastError();
    if (not segModel->submitAll())
        qDebug() << segModel->lastError();  // (*)
}

我可以使用 addNode() 成功添加 280 个节点。如果 nodeFrom

QSqlError("19", "Unable to fetch row", "Segment.nodeTo may not be NULL")

在 addSegment 函数中标有 (*) 的行中。

我在谷歌上搜索发现,当人们达到神奇的 256 条记录时,他们还遇到了其他(显然不相关的)问题。似乎没有解决方案可以解决这个特定问题。

我做错了什么?

谢谢!

【问题讨论】:

    标签: qt sqlite qsqlquery qsqltablemodel qsqldatabase


    【解决方案1】:

    这个错误的原因在于void QRelation::populateDictionary()方法使用了这样一个循环for (int i=0; i &lt; model-&gt;rowCount(); ++i)。如果您使用不返回查询大小的数据库(例如 SQLite),rowCount() 方法将返回这个神奇的 256 值。

    您可以通过在使用data(...)setData(...) 之前填充关系模型来解决此问题。一开始你可以尝试:

    setRelation(nodeFromCol, QSqlRelation("Node", "id", "name"));
    QSqlTableModel *model = relationModel(nodeFromCol);
    while(model->canFetchMore())
        model->fetchMore();
    

    【讨论】:

      【解决方案2】:

      试试这个方法解决

      newRec.setValue(1,QVariant(nodeFrom));
      
      newRec.setValue(2,QVariant(nodeTo));
      

      【讨论】:

        猜你喜欢
        • 2017-07-06
        • 1970-01-01
        • 2015-03-31
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 2011-08-21
        • 1970-01-01
        • 2022-01-24
        相关资源
        最近更新 更多