如何使用QSqlQueryModel从SQLite数据库中删除一行?

时间:2015-12-05 14:32:39

标签: c++ qt sqlite qt-creator

我试图从QSqlQueryModel中删除一行,如下所示:

void MainWindow::deleteRecord()
{
    int row_index= ui->tableView->currentIndex().row();
    model->removeRow(row_index);
}

但它没有用。

我也尝试了以下内容:

void MainWindow::deleteRecord()
    {
        int row_index= ui->tableView->currentIndex().row();    
        if(!db_manager->delete_record(QString::number(row_no))){
            ui->appStatus->setText("Error: data deletion ...");
        } else{
            ui->appStatus->setText("Record deleted ...");
        }
    }

在db_manager中,函数delete_recod(QString row_no)是:

bool DatabaseManager::delete_record(QString row_index)
{
    QSqlQuery query;
    query.prepare("DELETE FROM personal_Info WHERE ref_no =  (:ref_no)");
    query.bindValue(":ref_no",row_index);
    if (!query.exec())
    {
        qDebug() << "Error" << query.lastError().text();
        return false;
    }
    return true;
}

但也不行。在两次尝试中,应用程序都不会崩溃,也不会出现SQLite错误。

我做错了什么,如何解决?

1 个答案:

答案 0 :(得分:1)

第一种方法失败,因为QSqlQueryModel没有实现removeRows你没有检查它的返回值(坏!坏!坏!),这是{ {1}},意思是失败。

它怎么可能实现行删除功能?您的SQL查询可以是任何字面上的任何内容,包括删除行没有任何意义的结果集。

相反,请考虑使用false - 它可能不适用于您的案例,但考虑到您的QSqlTableModel声明的形式,我会这样说。 (DELETE仅显示一个表/视图的对象。)

第二种方法可能已经开始工作了。您没有看到UI更新的事实并不意味着什么 - 您应该检查实际的数据库内容以查看{{ 1}}语句实际上工作并删除了一些东西。

现在请注意,数据库没有任何内容告诉Qt更新其视图。您需要设置该基础架构。现代数据库支持触发器和信令系统(由QSqlTableModel包装在Qt中),可用于此目的。在其他情况下,您可以手动触发SQL模型的刷新,例如通过调用DELETE

相关问题