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
相关产品推荐
相关产品推荐

