You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QSQL数据库查询异常:无法获取数据并显示至Line Edit的问题排查

QSQL数据库数据无法显示到Line Edit?代码错误排查与修复方案

我正尝试从QSQL数据库获取数据,但无法成功获取到数据。我不需要将数据显示到表格中,而是希望将数据展示在指定的Line Edit组件里。请问代码存在什么错误?有哪些修改方案?以下是我使用的代码:

void Userdetails::on_pushButton_4_clicked() {
    delete ui;
    // database connection
    database = QSqlDatabase::addDatabase("QMYSQL");
    database.setHostName("localhost");
    database.setUserName("root");
    database.setPassword("");
    database.setDatabaseName("electricity");
    if(database.open()) {
        QSqlQuery qry;
        QSqlQuery query(QSqlDatabase::database("MyConnect"));
        query.prepare(QString("SELECT accno, fullname, address, telephone FROM user_reg_elec WHERE username = :username AND password = :password"));
        if(query.exec()) {
            query.exec();
            while(query.next()) {
                ui->dislayaccountnumber->setText(query.value(0).toString());
                ui->displayname->setText(query.value(3).toString());
                ui->displayaddress->setText(query.value(4).toString());
                ui->displattelephoneno->setText(query.value(5).toString());
                // ui->displayamountoebill->setText(query.value(6).toString());
            }
        } else {
            QMessageBox::information(this, "Query did not execute", "Not successful executing the query");
        }
    } else {
        QMessageBox::information(this, "Database not open", "Not opened successfully");
    }
    database.close();
}

我帮你仔细梳理了代码里的问题,这些错误是导致你无法获取并展示数据的核心原因:

代码中的关键错误

  • 第一行就把UI销毁了:delete ui;这行是致命错误!你刚点按钮就把整个UI组件删掉了,后面再去访问ui->dislayaccountnumber这些控件肯定完全无效,甚至直接崩溃,必须删掉这行。
  • 数据库连接不匹配:你用addDatabase创建了默认连接,但后面创建查询对象时却指定了一个叫"MyConnect"的连接——这个连接你根本没创建过,所以查询对象根本连不上你打开的数据库。
  • SQL参数没绑定:你写了:username和:password占位符,但完全没给它们赋值,这会导致查询找不到任何匹配数据,甚至执行失败。
  • 重复执行查询:你先调用query.exec()判断是否成功,然后又在if块里再执行一次,这不仅没必要,还会重置查询状态,反而可能出问题。
  • 字段索引完全错了:你的SELECT语句只查了4个字段:accno(索引0)、fullname(索引1)、address(索引2)、telephone(索引3),但你后面用了value(3)、value(4)、value(5)——这些索引都超出了查询结果的范围,根本取不到数据。
  • 重复创建数据库连接:每次点击按钮都调用addDatabase,多次点击会生成多个重复连接,浪费资源。
  • 关闭数据库时机不对:不管数据库有没有打开成功,你都直接调用close(),逻辑不严谨,应该只在打开成功后才关闭。

修复后的完整代码

我把所有错误都修正了,还加了一些实用的调试提示:

void Userdetails::on_pushButton_4_clicked() {
    // 先检查是否已有连接,避免重复创建
    if (QSqlDatabase::contains("MyConnect")) {
        database = QSqlDatabase::database("MyConnect");
    } else {
        database = QSqlDatabase::addDatabase("QMYSQL", "MyConnect");
        database.setHostName("localhost");
        database.setUserName("root");
        database.setPassword("");
        database.setDatabaseName("electricity");
    }

    if(database.open()) {
        QSqlQuery query(database); // 使用已打开的连接创建查询对象
        // 绑定用户名和密码参数,替换成你实际的输入控件
        query.prepare("SELECT accno, fullname, address, telephone FROM user_reg_elec WHERE username = :username AND password = :password");
        query.bindValue(":username", ui->lineEdit_username->text()); // 改成你的用户名输入框
        query.bindValue(":password", ui->lineEdit_password->text()); // 改成你的密码输入框

        if(query.exec()) {
            // 按用户名密码查询,最多一条结果,不用while,用if判断即可
            if(query.next()) {
                // 使用正确的字段索引
                ui->dislayaccountnumber->setText(query.value(0).toString()); // accno
                ui->displayname->setText(query.value(1).toString()); // fullname
                ui->displayaddress->setText(query.value(2).toString()); // address
                ui->displattelephoneno->setText(query.value(3).toString()); // telephone
            } else {
                QMessageBox::information(this, "提示", "未找到匹配的用户信息");
            }
        } else {
            // 显示具体错误信息,方便调试
            QMessageBox::warning(this, "查询失败", "执行出错:" + query.lastError().text());
        }
        database.close(); // 打开成功后再关闭
    } else {
        QMessageBox::warning(this, "数据库连接失败", "打开出错:" + database.lastError().text());
    }
}

额外的优化建议

  • 控件名称修正:你的控件名有拼写错误,比如dislayaccountnumber应该是displayaccountnumber,displattelephoneno应该是displaytelephoneno——这些错误会导致运行时找不到控件,一定要改过来。
  • 别在UI线程做耗时操作:如果数据库操作慢,会导致UI卡顿,建议把查询放到子线程,用信号槽更新UI。
  • 密码安全:现在代码里直接用明文密码查询,数据库里如果存明文密码非常不安全,建议对密码做哈希处理(比如SHA256),存储哈希值而非明文。

内容的提问来源于stack exchange,提问作者Geo Tech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:27:52