首页 > 解决方案 > 使用 SQLITE DB 在 qt 5.12.9 中更新查询不起作用(在 for 循环中查询)

问题描述

我是 sqlite 和 DB 的初学者,所以如果这是一个愚蠢的问题,请原谅我,但我厌倦了认为我不知道我是否在这里做一些愚蠢的事情。

我创建了一个带有(label-lineEdit)表单的小部件应用程序,用于名称、家庭(我的表格列,其名称是用户)我输入了名称和家庭我按下确定按钮,一切都很好。之后我意识到如果我删除一行,我的 (id)s 将不会自动进入增量序列(比如增加一个),这太难看了,所以我不得不做点什么。我添加了一个新按钮(名为修复表 id),这个按钮同时生成(行 id = 记录索引 +1)所以这是代码(其他东西,比如连接到数据库、驱动程序和其他东西工作完美,没有任何错误,所以我没有把它们放在这里)但是如果你需要它们请告诉:

void MainWindow::on_fix_table_id_clicked()
{
    QSqlQuery q;
        q.exec("SELECT * FROM user");
        QSqlQueryModel *qm = new QSqlQueryModel();
        qm->setQuery(q);
        int rows = get_rows()-1;
        QSqlRecord qr;
        QSqlQuery s;
       for(int i = 0 ; i <= rows ; i++){
            qr = qm->record(i);
            QString num = QString::number(i+1);
            s.exec("UPDATE user SET id = '"+num+"' WHERE id = '"+qr.value(0).toInt()+"'");
            qDebug() << "UPDATE user SET id = '"+num+"' WHERE id = '"+qr.value(0).toString()+"'";
       }  
}

get_rows() 方法简单地使用

"SELECT count(1) FROM user"

查询并正常工作,这是输出 (qDebug()) :

"UPDATE user SET id = '1' WHERE id = '3'"
"UPDATE user SET id = '2' WHERE id = '4'"
"UPDATE user SET id = '3' WHERE id = '5'"
"UPDATE user SET id = '4' WHERE id = '6'"
"UPDATE user SET id = '5' WHERE id = '7'"
"UPDATE user SET id = '6' WHERE id = '10'"

但即使在 DB 浏览器中也没有任何效果,也没有任何更新,而且我没有任何问题或错误消息

我在 DB Browser for SQLITE 中测试了这个查询,它们运行良好。

请原谅我糟糕的英语,如果这个问题是低级的或类似的问题:)

标签: sqliteqt

解决方案


您应该使用以下 2 列来组织您的表格:

  • id (Integer - Unique - Autoincrement) // 你永远不会修改,它是行的 id。
  • entryNumber(Integer) // 你可以对这个值做你想做的事

当你 INSERT INTO 时,你的 table id 会自动唯一,entryNumber 可以等于 MAX(entryNumber) + 1

删除一行后,您将使用以下内容更新表:

UPDATE user SET entryNumber = (entryNumber - 1) WHERE id > xx

使用 xx = 您取消的行 ID


推荐阅读