2

Qtアシスタントに基づいてSQLクエリを作成しましたが、prepare()代わりにメソッドを使用できると書かれており、次の2つのメソッドをexec()使用してパラメーターを渡すことができます。
bindvalue()addbindvalue()

これが私の問題のスニペットコードです:

Query->prepare("SELECT ID , Row , Col FROM sometable WHERE Row = :row AND Col = :col");
Query->bindValue(":row" , __Row);
Query->bindValue(":col" ,__Col);
Query->exec();
qDebug("%s" , Query->executedQuery().toStdString().c_str());

出力:

SELECT ID , Row , Col FROM sometable WHERE Row = ? AND 列 = ?

また、別の提案された方法を使用しました:

Query->prepare("SELECT ID , Row , Col FROM sometable WHERE Row = :row AND Col = :col");
Query->addBindValue(0 , __Row);
Query->addBindValue(1 ,__Col);
Query->exec();
qDebug("%s" , Query->executedQuery().toStdString().c_str());

出力:

SELECT ID , Row , Col FROM sometable WHERE Row = ? AND 列 = ?

しかし、exec()通常使用すると完全に機能し、「?」の代わりに対応する値を置き換えます。

それについての説明はありますか?または、通常の exec() を使用する必要がありますか?

4

3 に答える 3

5

exec()呼び出しは失敗していますか?使用しているSQLサーバーによっては、表示されている内容に問題がない場合があるため、サーバー(Oracleなど)でバインディングを実行できます。Qtのドキュメントによると、executeQuery: "ほとんどの場合、この関数はlastQuery(()と同じ文字列を返します。プレースホルダーを使用して準備されたクエリがそれをサポートしないDBMSで実行される場合、このクエリの準備はエミュレートされます"。したがって、サーバーがバインディング値をサポートしている場合、準備はエミュレートされないため、プレースホルダーが実際の値に置き換えられずにクエリが表示されるだけだと思います。

于 2010-01-17T08:05:40.223 に答える
3

これは単なる推測ですが、 http: //qt.nokia.com/doc/4.6/qsqlquery.htmlから次のように読みました。

警告: QSqlQuery を作成する前に、SQL ドライバーをロードして接続を開く必要があります。また、クエリが存在する間、接続は開いたままにする必要があります。それ以外の場合、QSqlQuery の動作は未定義です。

あなたの場合、接続は開いていますか?

于 2010-01-17T08:17:20.553 に答える
0

準備されたステートメントでクエリを構築する方法が必要な場合は、これを試すことができます。

qDebug("%s" , Query.lastQuery().toStdString().c_str());
于 2011-05-15T23:30:16.280 に答える