1

私がやりたいのは、delete ステートメントを query.exec() することです。削除が成功した場合は、更新されたテーブルを表示し、そうでない場合は、名前が一致しなかったことを示す QMessageBox を表示します。

DELETE ステートメントでエントリが見つからない場合、query.exec() は FALSE になるという印象を受けました。しかし、名前に何を入力しても、常に真実です。この問題を回避する方法はありますか? 皆さんありがとう...

したがって、私が現在持っているコードは次のとおりです。

bool ok;
QInputDialog *dialog = new QInputDialog;
QString name = dialog->getText((QWidget*)this->parent(), tr("Enter Buyer to Delete:"),
                                          tr("Buyer Name:"), QLineEdit::Normal,
                                          "", &ok);
QSqlTableModel *model1;
QSqlQuery query;
query.prepare("DELETE from buyers WHERE name=:name");
query.addBindValue(name);
bool x = query.exec();      //<----PROBLEM: EVEN WITH INCORRECT name,
qDebug() << x;              // query.exec() RETURNS true ALTHOUGH delete
if (!x)                     // IS SUPPOSED TO FAIL 
{
    QMessageBox box;
    box.setInformativeText("No buyer found with name matching " + name);
    box.exec();

}
model1 = new QSqlTableModel;
model1->setTable("buyers");
model1->select();

model1->setHeaderData(0, Qt::Horizontal, tr("ID"));
model1->setHeaderData(1, Qt::Horizontal, tr("Name"));
model1->setHeaderData(2, Qt::Horizontal, tr("Location"));
model1->setHeaderData(3, Qt::Horizontal, tr("Phone"));
model1->setHeaderData(4, Qt::Horizontal, tr("Email"));

QTableView *view1 = new QTableView;
view1->setWindowTitle("Buyer List updated");
view1->setModel(model1);
view1->show();
4

1 に答える 1

2

使用できますQSqlQuery::​numRowsAffected()

QSqlQuery query("your_query_here");
query.exec();
if(query.numRowsAffected() == 0)
{
    //didn't delete anything
}
else
{
    //worked fine
}

Qt docs ごとに、この関数に注意してください

結果の SQL ステートメントによって影響を受ける行数を返します。特定できない場合は -1 を返します。SELECT ステートメントの場合、値は未定義であることに注意してください。代わりに size() を使用してください。クエリがアクティブでない場合は、-1 が返されます。

于 2015-02-11T06:48:33.020 に答える