QSqlDatabasePrivate::removeDatabase: connection 'Conexion' is still in use, all queries will cease to work. ¿Es importante?
-
¿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(); }
-
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
-
@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(); }
-
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
-
@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.
-
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
-
@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. -
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
-
@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"));
-
@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