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

Qt开发SQLite控制台包装器查询输出异常问题求助

错误根因

你代码中读取查询结果时错误调用了QSqlRecord的value()方法,该对象仅存储查询结果的字段结构元数据,不包含实际的每行查询结果数据,所以读取到的都是字段默认值(数值型为0,字符串为空),而非数据库中存储的真实值。正确的做法是使用QSqlQuery实例的value()方法读取当前遍历行的字段值。

修正后完整可运行代码
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QTextCodec>
#include <iostream>
#include <iomanip>
#include <string>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv); // Qt控制台程序必须初始化QCoreApplication实例
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); // 解决中文输出乱码问题

    QSqlDatabase myDb = QSqlDatabase::addDatabase("QSQLITE");
    myDb.setDatabaseName("MyFirstDatabase.db");

    if(!myDb.open()){
        std::cout<< myDb.lastError().text().toStdString() << std::endl;
        return 1;
    }

    std::cout<<"Database is opened."<<std::endl << "To close the app, print \"exit\"" << std::endl;
    std::string requestString;
    QSqlQuery query;
    do{
        std::cout << "Input a command:" << std::endl;
        getline(std::cin, requestString);
        if (requestString.empty()) continue; // 过滤空输入

        QString QRequest = QString::fromStdString(requestString);
        if(requestString == "exit") break;

        query.clear(); // 清空上一次查询的残留状态
        bool execOk = query.exec(QRequest);

        if(execOk && query.isActive()){
            std::cout << "Request succeded." << std::endl;
        }else{
            std::cout << "Whoops, something went wrong! ERROR: " << query.lastError().text().toStdString() << std::endl;
            continue;
        }

        if(query.isSelect()){
            QSqlRecord rec = query.record();
            // 输出表头
            for(int i = 0; i < rec.count(); i++){
                std::cout << std::left << std::setw(15) << rec.fieldName(i).toStdString();
            }
            std::cout << std::endl;
            // 输出每行数据
            while(query.next()){
                for(int j = 0; j < rec.count(); j++){
                    // 核心修改:用query.value而非rec.value读取当前行数据
                    std::cout << std::left << std::setw(15) << query.value(j).toString().toStdString();
                }
                std::cout << std::endl;
            }
        }

    }while(true);

    myDb.close();
    std::cout<<"Thanks for using database. All the best!"<<std::endl;
    return 0;
}
配套配置说明
  • 你需要在Qt项目的.pro配置文件中添加一行 QT += sql 引入SQL模块,否则会出现链接错误
  • 可根据实际字段长度调整setw()的参数,避免长内容展示错乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:06:02