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

