我有这样的任务:
我需要为SQLite数据库做一个控制台包装。输入一个查询,输出结果或错误
代码如下。输出有一个问题:所有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;
}
问题是值不是由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;
}