Problema com QSqlQuery::size() Retornando -1 no Qt

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.

  1. 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étodo QSqlDriver::hasFeature, algo que inicialmente ignorei.
  2. Em seguida, pesquisei sobre o uso de hasFeature em 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.

Tags: Qt QSqlQuery Oracle SQL

Publicado em 7-10 01:24