5

次の問題は、時折議論されてきました。しかし、それ自体の問題の解決策はありませんでした。私が知ったように、行を前方と後方に反復することには違いがあります。での前方反復は1 行のみになるQSqlQuery::next() 場合がありますが、 での後方反復でQSqlQuery::previous()常にすべての行が検索されます。前方反復が明示的に設定されているかどうかに関係なく、効果はありません。

編集: 参照が削除されました

Qtのドキュメントに関しては、正しいアプローチは次のとおりです。

QSqlQuery q = db.exec("SELECT * FROM Table");
while (q.next()) {
    // Do something with row...
}

ただし、これは 1 行のみになります。後方反復はすべての行を見つけます。

QSqlQuery q = db.exec("SELECT * FROM Table");
if (q.last()) {
    do {
        // Do something with row...
    } while (q.previous());
}

後方反復は非常に遅くなる可能性があるため、避ける必要があります。これがフォワードイテレーションで機能しない理由を知っている人はいますか?

編集:この動作は常に再現できるとは限りません。発生する場合もあれば、発生しない場合もあります。この場合、データベースには複数の行が含まれています。問題は、このコード スニペットで正確に発生します。同じ問題を抱えている人はいますか?

編集 2: Qt 4.8.5 でバグが修正されたようです。

現在の環境: Windows 7 (SP1)、Qt 4.8.5。

4

1 に答える 1

0

次の問題がここで何度も議論されているというのは、まったくの誤りです。あなたが提供する参照は、あなたが見ている動作とは何の関係もありません。

を置き換えるコードにバグがある可能性があります// Do something with row...。そのコード全体を表示する必要があります。また、問題が発生した時点で実際にはテーブルに 1 つの行しかないという事実を単純に確認することもできます。これは、データベースを変更する他のコードとの相互作用によるものですが、そのコードを共有することはありません。

順方向に反復するだけの場合はq.setForwardOnly(true)、これを呼び出す必要があります。これにより、一部のデータベース バックエンドで処理が高速化されます。

于 2013-09-10T13:43:15.030 に答える