1

1 つの Qt アプリケーションで 2 つの異なるデータベースに接続しようとすると問題が発生します。アプリケーションによって収集されたすべての情報を格納する情報データベースと、リリース後の簡単なデバッグのために、アプリケーション、ボタンの押下、画面の読み込みなどに発生したすべての変更を追跡できる新しいログ データベースがあります。個別に、データベースは完全に機能しますが、両方を使用しようとすると、1 つしか機能しません。これは、接続に名前を付けていなかったためである可能性があり、明らかに最近接続されたデータベースのみがデフォルト接続を使用できることを読みました。ただし、データベースに名前を付けると、まったく機能しません.isOpen()は両方でtrueを返しますが、クエリを実行しようとするとすぐにエラーが発生します

"QSqlQuery::prepare: database not open"

"QSqlError(-1, "Driver not loaded", "Driver not loaded")"

私の2つのデータベース宣言は次のとおりです。

database_location = filepath.append("/logger.sqlite");
logDB = QSqlDatabase::addDatabase("QSQLITE", "LoggerDatabaseConnection");
logDB.setHostName("localhost");
logDB.setDatabaseName(database_location);

Logger データベース接続と :

database_location = filepath.append("/db.sqlite");
db = QSqlDatabase::addDatabase("QSQLITE",  "NormalDB");
db.setHostName("localhost");
db.setDatabaseName(database_location);

また、データベースで最初のクエリを実行して、テーブルが存在するかどうかを確認するときに、使用しています

QSqlQuery query("LoggerDatabaseConnection");

通常のデータベースでも同様ですが、クエリを実行するデータベース接続を宣言した後でも接続の問題が発生します。

アプリケーションに使用されるデータベースは、名前空間で静的な QSqlDatabase として宣言され、グローバルな効果を作成します。これにより、以前のプログラマーである誰もがアクセスできるようになり、プライベート データベース接続を使用してログ データベースをシングルトンとして作成しました。私が言ったように、コードの両方のバージョンは別々に動作しますが、それらが一緒になると、互いに戦っています。Singleton と Dependecy Injection の適切な設計については大きな議論があることは承知していますが、コードは個別に動作するので、現時点での設計に満足しています。不足している情報やアイデアがあれば教えてください。ありがとうございました。

4

2 に答える 2

3
QSqlQuery query("LoggerDatabaseConnection");

コンストラクターの最初のパラメーターは、接続名ではなくクエリです。データベース オブジェクトを指定していないため、デフォルトの接続が使用されます。

次のようなことを試してください:

QSqlQuery query1("YourFirstQuery", db);
QSqlQuery query2("YourSecondQuery", logDB);

重要QSqlDatabase::open(): データベースを使用する前後に、およびを呼び出してデータベースを開いたり閉じたりすることも忘れないでくださいQSqlDatabase::close()

于 2014-10-16T19:48:12.633 に答える