Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Spanish
  4. QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?
Forum Updated to NodeBB v4.3 + New Features

QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?

Scheduled Pinned Locked Moved Solved Spanish
10 Posts 2 Posters 4.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    meepo1
    wrote on last edited by meepo1
    #1

    ¿Es este mensaje importante? He tratado de solucionarlo utilizando diferentes métodos. Supuestamente debería cerrar los queries pero ya lo hice y el problema aun persiste.

    Supuestamente el mensaje dice que se van a cerrar todos los queries anteriores y eso me gustaria para poder utilizar la conexion en otra Clase.

    void Ventanas0::on_pushButton_clicked(){
     QSqlQuery query1 (QSqlDatabase::database("Conexion"));
        query1.prepare("SELECT * FROM clientes");
        query1.exec();
        while(query1.next()){
        //El while hace algo por varias lineas
        }
        query1.finish();
        QSqlDatabase::removeDatabase("Conexion");
        if(mDatabase.open()){
            QMessageBox::information(this, "error",mDatabase.lastError().text());
        }
        Ventanas1 *v = new Ventanas1(this, vector);
        close();
        v->show();
    }
    

    void Ventanas0::DeCombobox(){
        for(int i = 0; i < 25; i++){
            QString num = QString::number(i);
            if (i == 0){
                ui->comboBox_25->addItem("");
            }else{
                ui->comboBox_25->addItem(num);
            }
        }
        QSqlQuery query(QSqlDatabase::database("Conexion1"));
        query.prepare("SELECT * FROM cursos");
        query.exec();
        while(query.next()){
        //30 lineas de codigo   
        }
        query.finish();
    }
    
    1 Reply Last reply
    0
    • juankiJ Offline
      juankiJ Offline
      juanki
      Moderators
      wrote on last edited by
      #2

      Hola

      Normalmente no es necesario llamar a QSqlDatabase::removeDatabase, sobre todo si después vas a seguir usando la conexión.

      El procedimiento normal es al inicio de tu programa llamar a QSqlDatabase::addDatabase para crear una conexión con la base de datos, luego, cada vez que necesites acceder a la base de datos llamas a QSqlDatabase::database para obtener la conexión con la base de datos que creaste al inicio.

      Y ya está, no necesitas llamar a QSqlDatabase::removeDatabase, cuando tu programa termine se cerrará la conexión con la base de datos.

      Si por algún motivo tienes/quieres cerrar la conexión con QSqlDatabase::removeDatabase, imagino que después tendrás que que volver a abrirla para poder usarla.

      Un saludo

      Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
      Procura escribir correctamente y sin faltas de ortografía.

      Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

      M 1 Reply Last reply
      1
      • juankiJ juanki

        Hola

        Normalmente no es necesario llamar a QSqlDatabase::removeDatabase, sobre todo si después vas a seguir usando la conexión.

        El procedimiento normal es al inicio de tu programa llamar a QSqlDatabase::addDatabase para crear una conexión con la base de datos, luego, cada vez que necesites acceder a la base de datos llamas a QSqlDatabase::database para obtener la conexión con la base de datos que creaste al inicio.

        Y ya está, no necesitas llamar a QSqlDatabase::removeDatabase, cuando tu programa termine se cerrará la conexión con la base de datos.

        Si por algún motivo tienes/quieres cerrar la conexión con QSqlDatabase::removeDatabase, imagino que después tendrás que que volver a abrirla para poder usarla.

        Un saludo

        M Offline
        M Offline
        meepo1
        wrote on last edited by meepo1
        #3

        @juanki La solucion esta en agregar los siguiente en on_pushButton_clicked() despues de query1.finish():

            query1.finish();
            QString conexion = mDatabase.connectionName(); //mDatabase es el nombre de mi QSqlDatabase
            mDatabase.close();
            mDatabase = QSqlDatabase();
            mDatabase.removeDatabase(conexion);
            if(mDatabase.open()){
                QMessageBox::information(this, "error",mDatabase.lastError().text());
            }
            Ventanas1 *v = new Ventanas1(this, vector);
            close();
            v->show();
        }
        
        juankiJ 1 Reply Last reply
        0
        • M meepo1

          @juanki La solucion esta en agregar los siguiente en on_pushButton_clicked() despues de query1.finish():

              query1.finish();
              QString conexion = mDatabase.connectionName(); //mDatabase es el nombre de mi QSqlDatabase
              mDatabase.close();
              mDatabase = QSqlDatabase();
              mDatabase.removeDatabase(conexion);
              if(mDatabase.open()){
                  QMessageBox::information(this, "error",mDatabase.lastError().text());
              }
              Ventanas1 *v = new Ventanas1(this, vector);
              close();
              v->show();
          }
          
          juankiJ Offline
          juankiJ Offline
          juanki
          Moderators
          wrote on last edited by juanki
          #4

          Hola

          Sigo sin entender porqué quieres eliminar la conexión con la base de datos y más aun, si viendo el código que has puesto justo después de eliminar la conexión ¡¡ llamas a open !!

          query1.finish();
          QString conexion = mDatabase.connectionName(); //mDatabase es el nombre de mi QSqlDatabase
          mDatabase.close();
          mDatabase = QSqlDatabase();
          mDatabase.removeDatabase(conexion);
          
          if(mDatabase.open()){
              QMessageBox::information(this, "error",mDatabase.lastError().text());
          }
          

          ¿Después de eliminar la conexión base de datos llamas a open?

          Además, este if lo tienes mal, open() devuelve true si todo fue bien, por lo tanto tú estás mostrando el mensaje de error si la base de datos se abre correctamente.

          Un saludo

          Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
          Procura escribir correctamente y sin faltas de ortografía.

          Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

          M 1 Reply Last reply
          0
          • juankiJ juanki

            Hola

            Sigo sin entender porqué quieres eliminar la conexión con la base de datos y más aun, si viendo el código que has puesto justo después de eliminar la conexión ¡¡ llamas a open !!

            query1.finish();
            QString conexion = mDatabase.connectionName(); //mDatabase es el nombre de mi QSqlDatabase
            mDatabase.close();
            mDatabase = QSqlDatabase();
            mDatabase.removeDatabase(conexion);
            
            if(mDatabase.open()){
                QMessageBox::information(this, "error",mDatabase.lastError().text());
            }
            

            ¿Después de eliminar la conexión base de datos llamas a open?

            Además, este if lo tienes mal, open() devuelve true si todo fue bien, por lo tanto tú estás mostrando el mensaje de error si la base de datos se abre correctamente.

            Un saludo

            M Offline
            M Offline
            meepo1
            wrote on last edited by
            #5

            @juanki Llamo a open para ver si de verdad se cerro. Solo sirve para eso, en realidad ahora que ya funciona puedo sacar el QMessageBox sin problema alguno. Solo quiero eliminar la conexión para que me deje de mostrar el mensaje del titulo, pues después en otra clase voy a volver a abrir la conexión.

            juankiJ 1 Reply Last reply
            0
            • M meepo1

              @juanki Llamo a open para ver si de verdad se cerro. Solo sirve para eso, en realidad ahora que ya funciona puedo sacar el QMessageBox sin problema alguno. Solo quiero eliminar la conexión para que me deje de mostrar el mensaje del titulo, pues después en otra clase voy a volver a abrir la conexión.

              juankiJ Offline
              juankiJ Offline
              juanki
              Moderators
              wrote on last edited by
              #6

              Hola @meepo1

              @meepo1 said in QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?:

              @juanki Llamo a open para ver si de verdad se cerro. Solo sirve para eso,

              Esa no es la forma de comprobar si la conexión está cerrada, ahí estás tratando de abrir la base de datos, para eso tienes el método isOpen. Además, como te dije, el if está mal.

              en realidad ahora que ya funciona puedo sacar el QMessageBox sin problema alguno. Solo quiero eliminar la conexión para que me deje de mostrar el mensaje del titulo, pues después en otra clase voy a volver a abrir la conexión.

              ¿Qué tiene que ver la conexión con la base de datos para sacar un mensaje? Y vuelvo a lo mismo, si después vas a volver a usar la base de datos ¿por qué eliminas la conexión?

              No soy ningún experto, pero creo que no estás haciendo el manejo de la base de datos correctamente. Puedes darle un vistazo a la propia clase QSqlDatabase.

              Un saludo

              Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
              Procura escribir correctamente y sin faltas de ortografía.

              Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

              M 1 Reply Last reply
              0
              • juankiJ juanki

                Hola @meepo1

                @meepo1 said in QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?:

                @juanki Llamo a open para ver si de verdad se cerro. Solo sirve para eso,

                Esa no es la forma de comprobar si la conexión está cerrada, ahí estás tratando de abrir la base de datos, para eso tienes el método isOpen. Además, como te dije, el if está mal.

                en realidad ahora que ya funciona puedo sacar el QMessageBox sin problema alguno. Solo quiero eliminar la conexión para que me deje de mostrar el mensaje del titulo, pues después en otra clase voy a volver a abrir la conexión.

                ¿Qué tiene que ver la conexión con la base de datos para sacar un mensaje? Y vuelvo a lo mismo, si después vas a volver a usar la base de datos ¿por qué eliminas la conexión?

                No soy ningún experto, pero creo que no estás haciendo el manejo de la base de datos correctamente. Puedes darle un vistazo a la propia clase QSqlDatabase.

                Un saludo

                M Offline
                M Offline
                meepo1
                wrote on last edited by
                #7

                @juanki El if y el Open sirven para saber si lo abrió o esta abierto. No estoy abriendo nada. En un tutorial justamente de uno de los autores que me pasaste en otro post, (en Tutorial QT-MYSQL) el chico usaba el if y open para saber si su DB había tenido algún problema para abrirse. Mi if y open es una copia de ese tutorial solo que no tiene el símbolo de admiración.

                Con respecto a cerrar la base de datos, pues son 2 cosas:
                1.- Sé que hay una manera de reutilizar una base de datos en otra clase y no cause el problema del mensaje del titulo, sin embargo, por más que busqué no encontré la solución, así que lo que hice fue cerrar y volver a abrir la conexión. Sé que no es optimo, pero ¿Qué más podría hacer?
                2.- La pregunta del titulo es lo que buscaba resolver, es decir, saber si de verdad ese mensaje es importante de solucionar, como nadie me dio la respuesta, entonces lo que hice fue enfocarme en evitar que el mensaje vuelva a aparecer.
                Yo soy un novato en esto del C++ y el Qt sin embargo, al autor del tutorial le funcionó.
                PD: Si revise el QSqlDatabase de Qt pero no ayudó a solucionar mi problema.

                juankiJ 1 Reply Last reply
                0
                • M meepo1

                  @juanki El if y el Open sirven para saber si lo abrió o esta abierto. No estoy abriendo nada. En un tutorial justamente de uno de los autores que me pasaste en otro post, (en Tutorial QT-MYSQL) el chico usaba el if y open para saber si su DB había tenido algún problema para abrirse. Mi if y open es una copia de ese tutorial solo que no tiene el símbolo de admiración.

                  Con respecto a cerrar la base de datos, pues son 2 cosas:
                  1.- Sé que hay una manera de reutilizar una base de datos en otra clase y no cause el problema del mensaje del titulo, sin embargo, por más que busqué no encontré la solución, así que lo que hice fue cerrar y volver a abrir la conexión. Sé que no es optimo, pero ¿Qué más podría hacer?
                  2.- La pregunta del titulo es lo que buscaba resolver, es decir, saber si de verdad ese mensaje es importante de solucionar, como nadie me dio la respuesta, entonces lo que hice fue enfocarme en evitar que el mensaje vuelva a aparecer.
                  Yo soy un novato en esto del C++ y el Qt sin embargo, al autor del tutorial le funcionó.
                  PD: Si revise el QSqlDatabase de Qt pero no ayudó a solucionar mi problema.

                  juankiJ Offline
                  juankiJ Offline
                  juanki
                  Moderators
                  wrote on last edited by juanki
                  #8

                  Hola

                  @meepo1 said in QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?:

                  @juanki El if y el Open sirven para saber si lo abrió o esta abierto. No estoy abriendo nada. En un tutorial justamente de uno de los autores que me pasaste en otro post, (en Tutorial QT-MYSQL) el chico usaba el if y open para saber si su DB había tenido algún problema para abrirse. Mi if y open es una copia de ese tutorial solo que no tiene el símbolo de admiración.

                  Imagino que sabes qué es ese signo de admiración. en tu caso no lo usas y estás mostrando un mensaje de error si la base de datos se abre con éxito, es decir, si ocurre un error no haces nada. Como te dije tratar de abrir una conexión no es la forma de averiguar si está abierta, para eso tienes el método isOpen que te comenté antes.

                  Con respecto a cerrar la base de datos, pues son 2 cosas:
                  1.- Sé que hay una manera de reutilizar una base de datos en otra clase y no cause el problema del mensaje del titulo, sin embargo, por más que busqué no encontré la solución, así que lo que hice fue cerrar y volver a abrir la conexión. Sé que no es optimo, pero ¿Qué más podría hacer?

                  La forma de reutilizar conexión es muy sencilla, como te comenté en en mi primer mensaje:

                  • Al inicio del programa llamar a QSqlDatabase::addDatabase y establecer la conexión con la base de datos.
                  • Desde cualquier punto que se desee acceder a la base de datos, llamar a QSqlDatabase::database para conectarse a ella.

                  Y no hay más, no es necesario llamar a QSqlDatabase::removeDatabase, si lo haces, estás eliminando la conexión con la base de datos y tendrás que volver a llamar a QSqlDatabase::addDatabase para volver a establecer la conexión, cosa innecesaria. Tu programa probablemente funcione por que a partir de de que llamas a removeDatabase usas la conexión por defecto que te crea Qt.

                  2.- La pregunta del titulo es lo que buscaba resolver, es decir, saber si de verdad ese mensaje es importante de solucionar, como nadie me dio la respuesta, entonces lo que hice fue enfocarme en evitar que el mensaje vuelva a aparecer.

                  Precisamente el error del título dice más o menos que la conexión que estás eliminando está en uso y que las consultas dejarán de funcionar. Por lo tanto, la forma de resolver el problema es no llamar a removeDatabase, que por otra parte, como ya te dije antes, salvo en ocasiones especiales, no es necesario hacerlo.

                  Un saludo

                  Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
                  Procura escribir correctamente y sin faltas de ortografía.

                  Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

                  M 1 Reply Last reply
                  1
                  • juankiJ juanki

                    Hola

                    @meepo1 said in QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?:

                    @juanki El if y el Open sirven para saber si lo abrió o esta abierto. No estoy abriendo nada. En un tutorial justamente de uno de los autores que me pasaste en otro post, (en Tutorial QT-MYSQL) el chico usaba el if y open para saber si su DB había tenido algún problema para abrirse. Mi if y open es una copia de ese tutorial solo que no tiene el símbolo de admiración.

                    Imagino que sabes qué es ese signo de admiración. en tu caso no lo usas y estás mostrando un mensaje de error si la base de datos se abre con éxito, es decir, si ocurre un error no haces nada. Como te dije tratar de abrir una conexión no es la forma de averiguar si está abierta, para eso tienes el método isOpen que te comenté antes.

                    Con respecto a cerrar la base de datos, pues son 2 cosas:
                    1.- Sé que hay una manera de reutilizar una base de datos en otra clase y no cause el problema del mensaje del titulo, sin embargo, por más que busqué no encontré la solución, así que lo que hice fue cerrar y volver a abrir la conexión. Sé que no es optimo, pero ¿Qué más podría hacer?

                    La forma de reutilizar conexión es muy sencilla, como te comenté en en mi primer mensaje:

                    • Al inicio del programa llamar a QSqlDatabase::addDatabase y establecer la conexión con la base de datos.
                    • Desde cualquier punto que se desee acceder a la base de datos, llamar a QSqlDatabase::database para conectarse a ella.

                    Y no hay más, no es necesario llamar a QSqlDatabase::removeDatabase, si lo haces, estás eliminando la conexión con la base de datos y tendrás que volver a llamar a QSqlDatabase::addDatabase para volver a establecer la conexión, cosa innecesaria. Tu programa probablemente funcione por que a partir de de que llamas a removeDatabase usas la conexión por defecto que te crea Qt.

                    2.- La pregunta del titulo es lo que buscaba resolver, es decir, saber si de verdad ese mensaje es importante de solucionar, como nadie me dio la respuesta, entonces lo que hice fue enfocarme en evitar que el mensaje vuelva a aparecer.

                    Precisamente el error del título dice más o menos que la conexión que estás eliminando está en uso y que las consultas dejarán de funcionar. Por lo tanto, la forma de resolver el problema es no llamar a removeDatabase, que por otra parte, como ya te dije antes, salvo en ocasiones especiales, no es necesario hacerlo.

                    Un saludo

                    M Offline
                    M Offline
                    meepo1
                    wrote on last edited by meepo1
                    #9

                    @juanki Sí sé qué es ese signo y ese mensaje si dice "error", "paraguay" o "Bienvenido" es irrelevante solo quiero que me diga algo para saber que se ha accedido a ese if. Bueno yo use el tutorial y el chico me parecio experto, pero parece mas acertado en todo caso usar el IsOpen().

                    El QSqlDatabase::addDatabase necesita declarar una variable como mDatabase solo una vez?:

                    mDatabase = QSqlDatabase::addDatabase("QMYSQL", "Conexion1");
                    

                    Es decir, si desde otro Dialog necesito utilizar la informacion de esa base de datos solo necesito declarar el QSqlQuery?

                    QSqlQuery query (QSqlDatabase::database("Conexion1"));
                    
                    juankiJ 1 Reply Last reply
                    0
                    • M meepo1

                      @juanki Sí sé qué es ese signo y ese mensaje si dice "error", "paraguay" o "Bienvenido" es irrelevante solo quiero que me diga algo para saber que se ha accedido a ese if. Bueno yo use el tutorial y el chico me parecio experto, pero parece mas acertado en todo caso usar el IsOpen().

                      El QSqlDatabase::addDatabase necesita declarar una variable como mDatabase solo una vez?:

                      mDatabase = QSqlDatabase::addDatabase("QMYSQL", "Conexion1");
                      

                      Es decir, si desde otro Dialog necesito utilizar la informacion de esa base de datos solo necesito declarar el QSqlQuery?

                      QSqlQuery query (QSqlDatabase::database("Conexion1"));
                      
                      juankiJ Offline
                      juankiJ Offline
                      juanki
                      Moderators
                      wrote on last edited by
                      #10

                      @meepo1 said in QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?:

                      pero parece mas acertado en todo caso usar el IsOpen().

                      Así es, es más apropiado usar isOpen para comprobar si la conexión está abierta que tratar de abrirla.

                      El QSqlDatabase::addDatabase necesita declarar una variable como mDatabase solo una vez?:

                      mDatabase = QSqlDatabase::addDatabase("QMYSQL", "Conexion1");
                      

                      Así es, solo es necesario hacerlo una vez, normalmente se hace al iniciar el programa, personalmente lo hago en el método main, así puedo controlar si se producen errores y mostrar una u otra ventana al usuario, o un error y salir del programa.

                      Es decir, si desde otro Dialog necesito utilizar la informacion de esa base de datos solo necesito declarar el QSqlQuery?

                      QSqlQuery query (QSqlDatabase::database("Conexion1"));
                      

                      Así es, puedes llamar a database desde donde quieras para obtener la conexión con la base de datos.

                      Por eso, si llamas a removeDatabase eliminas la conexión y tendrás que crear otra nueva para acceder, por eso te decía que no es necesario hacerlo, al menos en la mayoría de ocasiones, personalmente nunca lo he hecho en los varios programas con Qt que hice ya.

                      Un saludo

                      Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
                      Procura escribir correctamente y sin faltas de ortografía.

                      Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

                      1 Reply Last reply
                      1

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved