問題タブ [qsqldatabase]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
624 参照

c++ - QSqlDatabaseエラーが出力されず、出力もありませんか?

私はQSqlDatabasemysqlにデータを挿入するために使用します。

まず、次の名前のクラスを定義しますInserter

そして、InsertScheduler として定義された別のクラスで使用します。

このプログラムを実行すると、Qt が警告を出力します。

QSqlDatabasePrivate::removeDatabase: 接続 'qt_sql_default_connection' はまだ使用中です。すべてのクエリが機能しなくなります。

QSqlDatabasePrivate::addDatabase: 重複する接続名 'qt_sql_default_connection'、古い接続が削除されました。

誰かが言った:

QSqlDatabase::addDatabase() は、タイプと接続名ごとに 1 回呼び出されることになっています。addDatabase("QMYSQL") を複数回呼び出すと、QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

さらに、データベースを削除する際に既存の QSqlQuery オブジェクトを持つと、QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.

上記の警告の理由が正しい場合、警告の順序が正しくない理由:

QSqlDatabasePrivate::addDatabase: 重複する接続名 'qt_sql_default_connection'、古い接続が削除されました。

QSqlDatabasePrivate::removeDatabase: 接続 'qt_sql_default_connection' はまだ使用中です。すべてのクエリが機能しなくなります。

最後に、次のように初期コードをクラスに移動Schedulerします。

警告やエラーは出力されません。

0 投票する
1 に答える
614 参照

c++ - Qt -- SQLite を使用するプログラムがクラッシュする

Qt ライブラリ (つまり QSqlDatabase) を介して SQLite を使用するアプリケーションがあります。このアプリケーションを Qt Creator から (デバッグ構成とリリース構成の両方で) 実行すると、すべて期待どおりに動作しますが、.exe ファイルを介して手動でアプリケーションを起動しようとすると、SQLite データベース操作の直後にクラッシュします。実行可能ファイルのすぐ隣に「qsqlite.dll」ファイルがある「sqldrivers」ディレクトリが既にあります。SQLite で動作する関数の周りに try-catch ブロックが既にあるため、例外はありません。

私は何を間違っていますか?どうすれば修正できますか?

Qt5 と MSVC-11.0 を使用しています

前もって感謝します。

0 投票する
1 に答える
777 参照

c++ - Qt を使用してプログラムで primaryKey を取得する

プログラムで primaryKey を取得し、それを列名に変換しようとしています。この機能は正常に機能しません。

しかし、それを機能させる方法が見つかりません。空白の文字列が表示されます

0 投票する
2 に答える
885 参照

qt - QSqlRelationalTableModel - 256 より大きいレコードを挿入する

SQLite データベースにテーブルノード={id,name} とテーブルセグメント={id,nodeFrom,nodeTo} があり、node.id と segment.id は AUTOINCREMENT フィールドです。

次のように、ノード用の QSqlTableModel を作成しています。

ノードを挿入するために次のコードを使用します。

これはうまくいくようです。ここで、セグメントに対して、次のように QSqlRelationalTableModel を定義します。

そして、セグメントを挿入するための次のコードがあります。

addNode() を使用して、280 個のノードを正常に追加できます。nodeFrom<=256 および nodeTo<=256 の場合、セグメントを正常に追加することもできます。256 以上のノードを参照するセグメントについて、

addSegment 関数の (*) でマークされた行の 1 つ。

私がググったところ、魔法の 256 レコード数に達したときに、人々が他の (明らかに無関係な) 問題を抱えていることがわかりました。この特定の問題では解決策がないようです。

私は何を間違っていますか?

ありがとう!

0 投票する
1 に答える
1129 参照

c++ - Qt経由でデータベース内のテーブルをロックするには?

c++ を使用して Qt のデータベースに接続しました。

同時に、同じデータベースに接続し、「myTable」というテーブルを常に更新する Python プログラムがあります。

Qt から、ポーリングするたびに新しく更新された行を読みたいと思います。だから私はしたいです

テーブルをロックします。すべての行を読み取ります。すべての行を削除します。テーブルのロックを解除します。

Qtでテーブルをロックおよびロック解除するにはどうすればよいですか

0 投票する
1 に答える
51 参照

c++ - 閉じた GUI を接続するデータベース

私のプログラムGuiが閉じられたという問題があります。たとえば、次のコードをpushButtonClickedメソッドに入れます。

私のGuiが表示されますが、ボタンをクリックするとウィンドウが閉じます。
このコードを init-method に入れると、ウィンドウが表示されません。
このコードの何が問題になっていますか?
データベースは QSqlDatabase です。ヘッダーで宣言します。
このコードを削除すると、すべて正常に動作します。

0 投票する
1 に答える
420 参照

qt - QSQLDatabase (SQLite を使用) でデータベースを開くのに時間がかかる

SQLIte データベースを使用するアプリケーション win QT を開発しました。データベースのコピーは各サイトにあります。

あるサイトでは、サイト「BOB1」としましょう。問題なく完全に機能します。しかし、別のサイトで使用しようとすると、'BOB2' と言って、データベース接続を開くのに長い時間がかかります (約 2000 ミリ秒)。

おそらくネットワークに問題があるのではないかと考えたので、サイト「BOB1」のサーバーをサーバーとして使用しようとしましたが、問題なく動作しています。しかし、サイト 'BOB1' からサイト 'BOB2' のサーバーを使用しようとすると、同じ問題が発生します。だから私はそれがネットワークの問題ではないかもしれないと思った.

私の頭に浮かんだもう1つのことは、おそらくDNS解決の問題があるということでした. しかし、IP とホスト名を使用してサーバーに ping を実行しようとすると、応答時間は同じです。

何が問題になる可能性があるかについての任意のアイデアまたはポインタ。

PS: サーバー + データベース ファイル パスは、環境変数を使用して setDatabasePath() 関数で指定されます。

0 投票する
2 に答える
1546 参照

c++ - デバッグ中に Qt5/c++ が生成する「破損した共有ライブラリ リスト」エラー

正常に動作しているように見える Qt5/C++ アプリがありますが、デバッグ モード (GDB) で実行すると、QT Creator コンソール (stderr) にこのエラーが表示されます - ときどき!:

原因への参照が見つかりません。また、何がトリガーされているのかわかりません (QLinkedList の使用に関連するもの以外)。QVector に切り替えようとしましたが、同じエラーがポップアップすることがあります。

これは何ですか?どうすれば修正できますか? Valgrind はメモリの破損はないと言っています...これは誤った報告の問題ですか? それとも私は何か間違ったことをしていますか?


上記のエラーを下の最後の行 (4 行目) までたどりました。

これは私には意味がありません...誰かが QSqlDatabase::addDatabase 行が破損を引き起こす理由を説明できますか? 同様に、デバッグ時にのみエラーが表示されるのはなぜですか... gdbなしで実行しているときは表示されませんか?

0 投票する
3 に答える
6530 参照

qt - rowCount() が機能するために SQLite データベースで QSqlTableModel で fetchMore() を使用するタイミングと方法は?

私のクラス DataTable は QAbstractTableModel から派生しています。QSqlTableModel オブジェクトを内部で使用して、db テーブルからデータをフェッチします。これは、データベース内のすべての行のレコードを表します (より多くのことを行いますが、レコード数は常に db テーブル内の行数です)。

MySql では、私の DataTable::rowCount() 実装は QSqlTableModel で rowCount() を呼び出すだけで、うまく機能します。

SQLite を使用すると、db テーブルに 256 行を超える行がある場合、Qt の SQLite ドライバーは行数 256 を返すため、DataTable クラスも 256 を返しますが、これは間違っています。ドキュメントには、に電話するように指示されていますwhile (sql_model->canFetchMore()) sql_model->fetchMore();。内部 QSqlTableModel が作成された直後に fetchMore() を呼び出すと、実際には次の rowCount() 呼び出しで正しい値が返されます。しかし、データベースで何かが変更されると (私のクラスは QSqlTableModel で insertRow() または setData() を呼び出します)、次の QSqlTableModel::rowCount() 呼び出しは再び 256 を返します。

データベースは、特定の QSqlTableModel オブジェクトを使用するクラスによってのみ変更されます (または、DataTable をモデルとして使用するビューが何かを更新する可能性があります)。したがって、データベースに行を挿入できる他のプロセスはありません。

では、いつ DataTable クラスが fetchMore() を呼び出して、rowCount() が常に実際の行数を返すようにすべきでしょうか?
私のクラスは、QSqlTableModel によって発行されたシグナルの一部を fetchMore() を呼び出すスロットに接続する必要があると考えていますが、それが適切で信頼できる方法であるかどうかはわかりません。


更新

基本的な問題を示すコードを次に示します。

SQL モデルをロードした後、rowCount() は 256 (1) を返すため、fetchMore() を呼び出す必要があります。その後、rowCount() は実際の行数を返します。
その後、データが変更され、その後、rowCount() は再び 256 (3) を返します。

そのため、sql モデルに対するすべての書き込み操作の後に fetchMore() を呼び出す必要があるようです。しかし、この while/canFetchMore()/fetchMore() ループをモデルを変更するすべてのメソッドの最後に置くのではなく、beforeInsert(QSqlRecord&)、beforeUpdate(int, QSqlRecord&) を接続するだけで十分かどうか疑問に思っています。 beforeDelete(int) は、fetchAll()? を呼び出すスロットに通知しますか? これは信頼でき、適切でしょうか?

訂正: before* シグナルではなく (時期尚早)、おそらく layoutChanged()、dataChanged()、rowsInserted()、rowsRemoved()。


更新 2 :

SQL に関する注意: 理論的には別の SQL クエリをデータベースに送信できることはわかっていSELECT COUNTますが、これは質問の答えにはなりません。SQL を避けることができる限り、SQL は書きません。私の考えでは、このような SQL クエリを送信することは、オブジェクト指向の QAbstractTableModel クラスの目的に反しています。さらに、rowCount() は const (クエリを送信しないでください) であり、高速である必要があります。とにかく、これはrowCount()を修正しません。

fetchMore() を呼び出すスロットを関連するシグナル (上記参照) に接続し、 rowCount () ですべてがフェッチされたことをアサートすることになりました。
assert(!sql_model->canFetchMore())

これは、rowCount() が正しい行数カウントを失敗状態として報告できないためです。したがって、アサーションです。つまり、間違った行数を使用するよりも、アプリケーションをクラッシュさせたいと考えています。

それを dataChanged() シグナルに接続するだけでは(最初の回答で提案されているように: I would probably try to use dataChanged signal.)十分ではありません。dataChanged(const QModelIndex&, const QModelIndex&)rowsInserted(const QModelIndex&, int, int)rowsRemoved(const QModelIndex&, int, int)およびに接続しましたlayoutChanged()

動作しているように見えますが、アサーションはまだ失敗していません。

誰かがこれを明確に確認できる場合 (または、常に機能するとは限らない理由を説明する場合)、回答をいただければ幸いです。