3

私は、sqlite データベースを持つ QT C++ アプリケーションに取り組んでいます。テーブルは QTableView と QSqlTableModel を使用して表示されます。約 10K レコードのテーブルがあります。

私の問題は、レコードを 10,000 レコードのテーブルに更新しようとすると、「データベースがロックされているため、行をフェッチできません」というエラーが表示されることです。これは、行数が少ない場合 (たとえば 20) には発生しません。アプリケーションフォルダにジャーナルファイルが作成されます。一部のプロセスがデータベースのロックを保持しているようです。本当の原因を突き止めることはできません。

誰かが解決策を提案できますか?

ありがとう、プリヤンカ

4

2 に答える 2

5

Qt では、次のように PRAGMA をデータベースに送信します。

dbObj = QSqlDatabase::addDatabase(...);
dbObj.setDatabaseName(...);
dbObj.open();   
dbObj.exec("PRAGMA locking_mode = EXCLUSIVE");

しかし、それはあなたが望んでいることではないと思います。Qtのドキュメントから:

選択が実行されている間、ドライバーは更新のためにロックされます。これは、Qt の項目ビューが必要に応じてデータをフェッチするため (QSqlTableModel の場合は SqlQuery::fetchMore() を使用)、QSqlTableModel を使用するときに問題を引き起こす可能性があります。

QSqlQuery::isActive を見てください。

クエリがアクティブな場合は true を返します。アクティブな QSqlQuery は、exec() が正常に実行されたものの、まだ終了していないものです。アクティブなクエリが終了したら、finish() または clear() を呼び出してクエリを非アクティブにするか、QSqlQuery インスタンスを削除できます。

肝心なのは、適切に「非アクティブ」にする必要があるか、仲裁する必要があるどこかから発信されたブロッキングクエリがあるということです。

于 2013-10-11T21:24:48.143 に答える
5

sqlite データベースを別のウィンドウで開いているかどうかを確認します。同じ問題がありましたが、データベースの別の開いているウィンドウに保存されていない変更があることに気付きました。そのインスタンスが閉じられると、すべてが完全に機能しました。

于 2016-12-02T03:36:44.357 に答える