1

準備済みステートメントで QSqlQueryModel を使用すると問題が発生します。ステートメントを手動で実行するとすべて正常に動作しますが、モデルにバインドすると実行されません。一方、モデルを「静的」クエリ (QString 経由) で設定すると、モデルが実行され、データが読み込まれます。私は何を間違っていますか?

次のようなクエリを作成します。

QSqlQuery query;
query.prepare(QString("SELECT \
        kontrahentid \
        , trim(format ('%s %s %s', kontrahentnazwafirmy, kontrahentnazwisko, kontrahentimie) ) as nazwa \
    FROM kontrahent \
    WHERE %1 ilike ? \
").arg(searchBy));
query.addBindValue(searchString);

そして、次のようにクエリすると機能します。

if (query.exec()) {
    while (query.next()) {
        qDebug() << "{" << query.value(0) << ", " << query.value(1) << "}";
    }
}

postgres ログには、prepare ステートメントがあり、その直後にそれを実行しています。しかし、それをモデルにバインドすると機能しません:

QSqlQueryModel* model = new QSqlQueryModel(this);
model->setQuery(query);
//model->setQuery("SELECT kontrahentid, trim(format ('%s %s %s', kontrahentnazwafirmy, kontrahentnazwisko, kontrahentimie) ) as nazwa FROM kontrahent");
if (model->lastError().isValid()) {
    qDebug() << model->lastError();
    return;
}

for (int i = 0; i < model->rowCount(); ++i) {
    //int id = model.record(i).value("id").toInt();
    //QString name = model.record(i).value("name").toString();
    qDebug() << model->record(i).value(0) << model->record(i).value(1);
}

postgres ログには、prepare ステートメントしかありません。実行の兆候はありません...

私は何を間違っていますか?モデルにバインドする前に、クエリ オブジェクトに対して execute() を実行する必要がありますか?

4

1 に答える 1

3

モデルにバインドする前に、クエリ オブジェクトに対して execute() を実行する必要がありますか?

はい。QSqlQueryModel::setQuery(const QSqlQuery & query)のドキュメントには次のように書かれています。

クエリはアクティブである必要があり、isForwardOnly() であってはならないことに注意してください。

クエリがアクティブになるには、クエリが実行されている必要があります。QSqlQueryのドキュメントには次のように書かれています。

正常に実行された SQL ステートメントはクエリの状態をアクティブに設定し、isActive() が true を返すようにします。それ以外の場合、クエリの状態は非アクティブに設定されます。どちらの場合も、新しい SQL ステートメントを実行すると、クエリは無効なレコードに配置されます。アクティブなクエリは、値を取得する前に (isValid() が true を返すように) 有効なレコードに移動する必要があります。

于 2014-08-28T09:43:09.683 に答える