QSqlQuery::size() Retornando -1
Durante o desenvolvimento de um projeto utilizando Qt para conexão com um banco de dados Oracle, deparei-me com um problema peculiar: apesar da conexão ser estabelecida com sucesso, não conseguia recuperar os resultados das consultas SQL.
QSqlDatabase conexaoOracle = QSqlDatabase::addDatabase("QOCI");
QSqlQuery consultaBanco;
consultaBanco = QSqlQuery(conexaoOracle);
qDebug() << instrucaoSQL; //instrucaoSQL contém a consulta SQL
if (!consultaBanco.exec(instrucaoSQL)) {
qDebug() << "Erro na execução!";
}
qDebug() << "Tamanho da consulta: " << consultaBanco.size();
for( int i=0;i<=consultaBanco.size();i++){
dadosRecebidos.push_back(consultaBanco.value(0).toInt());
qDebug() << "Valor da consulta: " << consultaBanco.value(0);
}
O método consultaBanco.size() continuava retornando -1, o que me fez怀疑ar que a conexão com o banco não estava funcionando corretamente.
Como não tenho experiência com bancos de dados, verifiquei se a consulta SQL funcionava no cliente Oracle local e confirmava que ela executava sem problemas. Foi quando comecei a buscar alternativas.
Encontrei em outro blog uma abordagem diferente:
QSqlDatabase conexaoOracle = QSqlDatabase::addDatabase("QOCI");
QSqlQuery consultaBanco;
consultaBanco = QSqlQuery(conexaoOracle);
qDebug() << instrucaoSQL; //instrucaoSQL contém a consulta SQL
if (!consultaBanco.exec(instrucaoSQL)) {
qDebug() << "Erro na execução!";
}
qDebug() << "Tamanho da consulta: " << consultaBanco.size();
// Alteração fundamental aqui, utilizando QSqlQuery::next()
while (consultaBanco.next()) {
dadosRecebidos.push_back(consultaBanco.value(0).toInt());
qDebug() << consultaBanco.value(0).toString();
}
Esta abordagem alternativa funcionou perfeitamente!
Determinado a entender a causa do problema, iniciei uma investigação detalhada.
- Primeiro, consultei a documentação oficial do Qt sobre
QSqlQuery::size(). A documentação explica que o método size() retorna o número de registros no resultado, mas retorna -1 quando esse tamanho não pode ser determinado ou quando o driver do banco de dados não suporta relatar informações sobre o tamanho da consulta. A documentação também sugere verificar o métodoQSqlDriver::hasFeature, algo que inicialmente ignorei. - Em seguida, pesquisei sobre o uso de
hasFeatureem diversos fóruns. Descobri que sites internacionais como StackOverflow possuem mais informações técnicas sobre esses tópicos. Encontrei a resposta definitiva no link: https://stackoverflow.com/questions/26495049/qsqlquery-size-always-returns-1
A solução proposta era:
QSqlDatabase db = QSqlDatabase::addDatabase("QOCI");
qDebug() << db.driver()->hasFeature(QSqlDriver::QuerySize);
Esta verifica se o driver do Oracle suporta o recurso de relatar o tamanho das consultas.
Esta experiência me ensinou a importância de consultar atentmaente a documentação oficial e buscar informações em fontes internacionais para problemas específicos de programação.