4

問題は、sql insert queryを実行すると(Qt Creatorとsqliteを使用している)、1つではなく2つの新しい行がデータベースに追加されることです。

これがコードブロックです

void MainWindow::on_insertButton_clicked(){
 db.open();
 QString name = ui->nameLineEdit->text();
 QString queryString = "INSERT INTO highscores (name, score) VALUES '%1',%2";
 QSqlQuery query(queryString.arg(name).arg(score));
 query.exec();
}

このコードは、値nameとscoreをデータベースに1回だけ挿入する必要がありますが、queryexecの後に2つの同じ行が挿入されます。

誰もが何が問題なのか考えていますか?

4

2 に答える 2

6

Isntead of

QString queryString = "INSERT INTO highscores (name, score) VALUES '%1',%2";

あなたは書くべきです

QString queryString = "INSERT INTO highscores (name, score) VALUES ('%1',%2)";

SQLのコマンドは、コンマで区切られたデータセットのリストをINSERT想定しています。各データセットは、列の値とともに括弧で囲まれています。VALUES

次のコマンドは、1つのタプルをテーブルに挿入しますtable

INSERT INTO table (col1, col2) VALUES (val1, val2);
| col1 | col2 |
+------+------+
| val1 | val2 |

2つの値を括弧で囲まなかったため、SQLiteにそれぞれ1つの値を持つ2つのデータセットを挿入するように依頼しました。

INSERT INTO table (col1, col2) VALUES val1, val2;
| col1 | col2 |
+------+------+
| val1 |      |
| val2 |      |

(面白いことに、SQLiteとMySQLの両方のインストールでこれをテストしました。括弧をまったく省略した場合、どちらもエラーをスローしました。ただし、これはバージョンと使用しているオプションによって異なる場合があります。)

SQLクエリの引数の入力には絶対に使用しないでください。QString::arg

(または、連結などの他の文字列構築方法。)これにより、 SQLインジェクションが発生する可能性があります。

可変引数を使用してステートメントを作成するには、 QSqlQueryバインド値によって提供されるSQLプリペアドステートメントを使用する必要があります。

QString queryString = "INSERT INTO highscores (name, score) VALUES (?,?)";
QSqlQuery query(queryString);
query.addBindValue(name);
query.addBindValue(score);
query.exec();

プリペアドステートメントで文字列引数を引用しなかったことに注意してください。

于 2012-05-27T14:13:27.360 に答える
1

ボタンクリックイベントが2回呼び出されたようです。これは通常、connectSlotsByName(this);2回使用されるためです。コード内のこの行を削除すると、機能するはずです。

于 2012-05-27T14:05:37.880 に答える