首页 > 解决方案 > Qt 中的 SQL 数据库输出

问题描述

我有这样的任务:

我需要为 SQLite 数据库制作一个控制台包装。输入 ios 一个查询,输出是结果或错误

代码如下。输出有问题:所有 ID 均为 0,名称为空。建议,如何做出正确的输出。

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

    if(!myDb.open()){
        std::cout<< myDb.lastError().text().toStdString() << std::endl;
    }
    else{
        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);

            QString QRequest = QString::fromStdString(requestString);

            if(requestString != "exit"){
                 query.exec(QRequest);

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

                 if(query.isSelect()){
                    QSqlRecord rec = query.record();

                    for(int i = 0; i < rec.count(); i++){
                        std::cout << std::setiosflags(std::ios::left);
                        std::cout << std::setw(10) << rec.fieldName(i).toStdString();
                    }
                    std::cout << std::endl;

                    while(query.next()){
                        std::cout << std::setiosflags(std::ios::left);
                        for(int j = 0; j < rec.count(); j++){
                            std::cout << std::setw(10) << rec.value(j).toString().toStdString();
                        }
                        std::cout << std::endl;
                    }
                 }
            }


        }while(requestString!="exit");
    }
    myDb.close();
    std::cout<<"Thanks for using database. All the best!"<<std::endl;
    return 1;
}

标签: c++sqlsqliteqt

解决方案


问题是值不是由 Record 承载,而是由 Query 承载。所以有正确的输出:

while(query.next()){
    std::cout << std::setiosflags(std::ios::left);
    for(int j = 0; j < rec.count(); j++){
        std::cout << std::setw(10) 
        <<query.value(j).toString().toStdString();
    }
    std::cout << std::endl;
}

推荐阅读