Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QSqlQuery::value: not positioned on a valid record al ejecutar una vista



  • Que tal, hace poco quise migrar una base de datos mysql a un hosting (GoDaddy), después de batallar con permisos de usuario por fin logré subir en su totalidad la base de datos, mi sistema funciona, a excepción de unas vistas que no logro hacer que se ejecuten, pensaba que era problemas de permisos de usuario, pero gestores como HeidiSQL y Dbeaver pueden ejecutar estas vistas sin problemas.

    Tengo estas rutinas que hice para agilizar un poco la conexión

    QString TDataBase::Conecta(QString Driver, QString Alias, QString Host, QString DataBaseName, int Puerto, QString User, QString Password)
    {
        if(Conectado==false)
        {
            //QSqlDatabase Base;
            if(QSqlDatabase::contains(Alias))
                Base=QSqlDatabase::database(Alias);
            else
                Base=QSqlDatabase::addDatabase(Driver,Alias);
    
            Base.setHostName(Host);
            Base.setDatabaseName(DataBaseName);
            Base.setPort(Puerto);
            Base.setUserName(User);
            Base.setPassword(Password);
            Base.open();
    
            if(!Base.open())
                return Base.lastError().text();
            else
                return "0";
            Conectado=true;
        }
        else
            return Base.lastError().text();
    }
    //---------------------------------------------
    QString TDataBase::Consulta(QString Alias, QString Comando)
    {
        QSqlQuery Consul(QSqlDatabase::database(Alias));
        Query=Consul;
        Query.clear();
        Query.prepare(Comando);
        if(Query.exec())
        {
            Query.next();
            return "0";
        }
        else
        {
            Consul.lastError();
            return "-1";
        }
    }
    

    Y en un módulo intento ejecutar una vista

    Data.Conecta("QMYSQL","ConSQL",Var.DbServer,Var.DbName,3306,Var.DbUser,"sqlsa");
    Data.Consulta("ConSQL","select codigo,descripcion,status,Estado,vendido,fecha,reimpresion,fecventa,elaboro,vendedor,estadero from vis_infoprod where codigo='"+ui->EdtSearCode->text()+"'");
    

    Sin embargo en mi programa me arroja este error:

    QSqlQuery::value: not positioned on a valid record
    

    Sin embargo, al ejecutar en una base de datos local la vista se ejecuta sin problemas, incluso probé la base de datos en otro servidor de pruebas (Heliohost.org) y también funciona sin problemas, incluso verifiqué la conexión remota y en efecto, la conexión se realiza sin problemas, también ejecuté la vista copiando el código de esta y sólo de esta manera logro que se ejecute, pero de esta manera es muy problemático y pierdo una funcionalidad importante de la base de datos.

    Lo único que me queda pensar es que posiblemente el query tarda en ejecutarse y el servidor cierre la conexión, quisiera saber si hay alguna manera de "prolongar" el tiempo de espera, agradezco de antemano cualquier ayuda.



  • Buenas tardes.
    Si no me equivoco, de memoria debes poner Query.first() antes de poder hacer un Query.next() y no se que te devolverá si el consulta tiene 0 o 1 resultados.



  • @JAVH said in QSqlQuery::value: not positioned on a valid record al ejecutar una vista:
    además

        Base.open();
    
        if(!Base.open())
    

    no es una buena idea, aunque probablemente funcione.

    if(!Base.open())
        ....
    

    o

    Base.open();
    if(!Base.isOpen())  // o if(!Base.isOpenError()) 
        ....
    

    ?



  • @Ladis said in QSqlQuery::value: not positioned on a valid record al ejecutar una vista:

    Buenas tardes.
    Si no me equivoco, de memoria debes poner Query.first() antes de poder hacer un Query.next() y no se que te devolverá si el consulta tiene 0 o 1 resultados.

    Si, de hecho le hice unas modificaciones, por si sólo es un registro

    QString TDataBase::Consulta(QString Alias, QString Comando)
    {
        QSqlQuery Consul(QSqlDatabase::database(Alias));
        Query=Consul;
        Query.clear();
        Query.prepare(Comando);
        if(Query.exec())
        {
            if(Query.size()==1)
                Query.first();
            else
                Query.next();
            return "0";
        }
        else
        {
            Consul.lastError();
            return "-1";
        }
    }
    

    @JonB said in QSqlQuery::value: not positioned on a valid record al ejecutar una vista:

    @JAVH said in QSqlQuery::value: not positioned on a valid record al ejecutar una vista:
    además

        Base.open();
    
        if(!Base.open())
    

    no es una buena idea, aunque probablemente funcione.

    if(!Base.open())
        ....
    

    o

    Base.open();
    if(!Base.isOpen())  // o if(!Base.isOpenError()) 
        ....
    

    ?

    Lo he revisado y sí hace la conexión, de hecho en todo este tiempo es la primera vez que se me presenta este tipo de problemas, incluso en otro hosting web (heliohost) la vista se ejecuta sin problemas, pero no en godaddy, pensaba que sería una restricción de godaddy pero gestores como heidisql y dbeaver ejecutan estas vistas remotamente sin problemas.

    Lo raro de todo esto es que el query de la vista no se ejecuta, sin embargo si cargo el código de la vista como si fuera un query normal ahí sí se ejecuta y me muestra los datos, estaba pensando que posiblemente la vista es más lenta que un query y se llegara a cerrar la conexión antes, ya no sé qué a qué se deba.

    Al alguna rutina o algo extra que se deba hacer cuando la base de datos es remota??

    Saludos.



  • Buenas tardes.
    Supongo que te falta código en medio porque si no la funcion no tiene mucho sentido. De todas formas el query.first() hay que ejecutarlo.
    Además te recomiendo el uso se query.numRowsAffected() en lugar de query.size() por si no es soportado por ese servidor de base de datos.
    Un saludo.



  • El detalle es que, si paso el código de mi vista a un query normal, se muestra sin problemas, incluso he subido la misma base de datos a otro hosting y las vistas que en el hosting anterior no se ejecutan aquí sí corren sin problemas, veré si hay algun problema en la codificación que es lo único que se me ocurre o en nombres de tablas.

    Saludos.


  • Moderators

    Hola @JAVH

    ¿No será cosa del hosting? Si en uno funciona y en otro no, puede que sea algún tema de configuración o algo en el hosting que no funciona.

    Un saludo


Log in to reply