1

Oracle データベースを実装しました。アプリケーションの GUI と db のインターフェイスとして Qt を使用しています。データベースへの接続を設定し、QTableView にテーブルを表示すると正常に動作します。すべてのセルの編集は、通常、QSqlTableModel を使用してネイティブにサポートされています。ただし、関連付けられているデフォルトの ItemDelegate がセルを編集するときに、Qt はデータベースによって定義された制約を考慮していないようです。

外部キー値であるセルを編集すると、Qt ではキー値を入力できないだけでなく、これらの変更を送信して更新を実行するためにデータベースにクエリを実行するとします。設定された制約により、これは明らかに機能しません。ここで、ビューのデフォルトの ItemDelegate が編集時に有効な値をチェックすることを期待するには、質問が多すぎるかもしれないことがわかりました。

サポートされていない値を送信すると、実際の問題が発生します。ビューは引き続き値の変更を適用し、編集が有効であることを示します。エラーは処理されず、エラー メッセージも配信されません。そこから、制約に従う値への変更を元に戻すまで、ビューは一部の行の編集を許可しません。

データベースの制約に対して値の変更を検証するために、独自のitemDelegateをセットアップする必要があるとは信じがたいです。

この投稿に答えることができ、接続の設定方法を知っている人なら誰でもできると思うので、コードを少し分解します。

bool driverSuccess = validDriver(driver);
if(driverSuccess) {
    _db = QSqlDatabase::addDatabase(driver);
    _db.setHostName(host);
    _db.setDatabaseName(dbName);
    _db.setPort(port);
    _db.setUserName(user);
    _db.setPassword(pwd);

    _db.open();
    //... validate connection
}

// setup table model and connect to view
QSqlRelationalTableModel* model = new QSqlRelationalTableModel;
model->setTable(tableName);
model->select()

QTableView* table_view = new QTableView(0);
table_view->setModel(model);

//...
_db.close()

助けていただければ幸いです。ありがとう!

4

1 に答える 1

1

これは予想されることです。データベース ドライバーは、制約の検証も行いません。データベースがそれを行います。できることは、失敗したクエリを送信することだけです。Qt が行うこともそれだけです。おそらく、テーブル モデルは、変更が成功したことを示すのではなく、変更を元に戻すことによって、エラーに適切に反応する可能性があります。Qt側でその動作に影響を与える設定/フラグがあるかどうかはわかりません。

何が期待できるかを理解したい場合は、SQLPLUS テキスト クライアントまたは同様のユーティリティを使用して手動でクエリを実行してください。

クライアントが管理テーブルから制約を取得し、何らかの方法で UI に適用することが技術的に可能になりました。ただし、自分で実装する必要があります-Qtはそれを行いません。

の関係に固有の制約のみに関心がある場合は、QSqlRelationalTableModel追加のクエリを作成せずにそれらを強制できますが、デリゲートはそれらについて何も知りません。モデルだけが知っており、モデルがこれをデリゲートに公開するための標準的なメカニズムはありません。独自の方法を考案し、それを処理できるカスタム デリゲートを用意する必要があります。

于 2015-08-12T21:05:18.347 に答える