1

ここに私のコードがありますが、何も間違っているようには見えません:

QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("thedata.sqlite");
db.open();

QSqlQuery query;
query.prepare("SELECT lastname FROM people where firstname='?' ");
query.bindValue(0, lineEdit->text());

bool x = query.exec();

if(x){
   lineEdit_2->setText(query.value(0).toString());
 }

 else {
   QSqlError err;
    err = query.lastError();
    QMessageBox::about(this,"error",err.text()   );
 }

プログラムが常に動作している場合、エラーparameter count mismatchI'm using qt 4.8 and its own headers for using sqlite. が表示されます。

Googleで検索しましたが、この問題には多くの投稿が表示されますが、何も役に立ちませんでした。

ありがとうございました。

4

1 に答える 1

2

準備されたステートメントは間違っています。次のようにする必要があります。

quary.prepare("SELECT lastname FROM people where firstname=?");

'プレースホルダーを一重引用符 ( ) で囲んでいないことに注意してください。引用符を付けると、リテラルとしてデータベースに渡され、パラメーターのないクエリとコードが多すぎるパラメーターを渡すことになります。

(その変数名を に変更するqueryのもいい感じです。)

また、 の場合は戻り値を確認し、QSqlQuery::prepare失敗した場合はそれから取得したエラー メッセージを出力/表示する必要があります。そうしないQSqlQuery::execと、現在のエラーがリセットされ、解析に問題があった場合はかなり意味のないエラー メッセージが表示されます。準備された声明。

if(x){
  lineEdit_2->setText(quary.value(0).toString());
}

これも誤りです。query.next()返された最初の行 (存在する場合) に結果セットを配置するには、 を呼び出す (および戻り値を確認する) 必要があります。.value(X)呼び出す前に使用することはできません.next()

于 2012-12-18T17:32:44.407 に答える