Cómo puedo crear dos conexiones a una misma base de datos desde diferentes clases ?
-
Hola
¿Te refieres a acceder a la base de datos desde diferentes clases? No hay problema. Supongo que también se pueden crear diferentes conexiones y usar unas para uno cosa y otras para otra, pero aun no he tenido ocasión de probarlo.
Pero una conexión y usarla en diferentes clases no hay problema, la única condición es que tienes que controlar quien cierra la conexión, por que si una clase la cierra y luego tratas de usarla desde otra sin abrirla previamente, obtendrás un error.
A modo de ejemplo te copio un poco de código de un proyecto que tengo en curso. Yo cero la conexión en el método main, junto con diferentes comprobaciones para ver si el programa puede iniciar o la ventana inicial que mostrar al usuario:
main.cpp
// conexión con la base de datos SQLite QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "conexion_db"); db.setDatabaseName(carpetaDatos + QDir::separator() + "****.sqlite"); if(!db.open()) { mostrarError("Error al abrir la base de datos", db.lastError().text()); return EXIT_FAILURE; } // crear las tablas si no existen if(db.tables().isEmpty()) { QSqlQuery consulta(db); if(!consulta.exec("CREATE TABLE .......)")) { mostrarError("Error al crear la tablas", consulta.lastError().text()); return EXIT_FAILURE; } }
// ........
Luego en cualquier clase que quieras acceder tan solo tienes que obtener una referencia a la conexión creada antes:
QSqlDatabase db = QSqlDatabase::database("conexion_db"); QSqlQuery insert(db); insert.prepare("insert into ........."); insert.bindValue("...", ...); if(insert.exec()) {
// insert exitoso
}Así lo hago yo, no sé si es la mejor forma, pero funciona, la precaución, como te dije, controlar quien cierra la conexión con la base de datos, que en programas pequeños no es problema.
Un saludo
-
juanki, gracias vere que tal me va de esa forma aqui te dejo un codigo que es como lo hago y si puedes dime si esta bien o es mejor tu forma:
//en el costructor de mi clase principal inicializo la DB:
QSqlDatabase mDatabaseDial2;
mDatabaseDial2 = QSqlDatabase::addDatabase("QSQLITE");
mDatabaseDial2.setDatabaseName(nombreArchivo);
mDatabaseDial2.setConnectOptions(QSQLITE_OPEN_READONLY);/
if (!mDatabaseDial2.open()){
QMessageBox::critical(this,"Error al abril la base de datos",mDatabaseDial2.lastError().text());
return;
}//ya despues realizo las consultas, por ejemplo asi :
QString current_versiculo;
mModel = new QSqlQueryModel(this);
mModel->setQuery(CONSULTAS::consul_buscar.arg(1).arg(22).arg(3));
current_versiculo = mModel->index(0,6).data().toString();
mModel->clear();
mModel->destroyed();//y cuando cambio de clase para otra, finalizo la QSqlDatabase inicializada , asi:
if(mDatabaseDial2.isOpen()){
QString cone = mDatabaseDial2.connectionName();
mDatabaseDial2.commit();
mDatabaseDial2.close();
mDatabaseDial2.removeDatabase(cone);
qDebug()<<"se cerro mDatabaseDial2";
}else{
qDebug()<<"Ya estaba cerrada mDatabaseDial2...";
} -
Hola
@Ricardo.A said in Cómo puedo crear dos conexiones a una misma base de datos desde diferentes clases ?:
Se me olvidaba gracias y saludos, una última cosa de esa forma que me mostraste no tengo que cerrara la conexión que llamo por referencia, se destruye sola. Saludos
Esa forma es más o menos lo que yo hago, la diferencia es que yo le doy un nombre a la conexión (segundo parámetro del método addDatabase) y tu usas la conexión por defecto. En principio creo que no hay por que cerrarla, se cierra sola cuando se sale, yo sí la he ido cerrando manualmente en algún programa, pero en este que estoy haciendo no, por que realmente no tiene sentido, ya que el programa está todo el lato leyendo/escribiendo en la base de datos, perdería más tiempo abriendo y cerrando la conexión.
Y, haciéndolo de esta forma, ¿no puedes acceder a la base de datos desde diferentes clases? No debería darte problemas.
@Ricardo.A said in Cómo puedo crear dos conexiones a una misma base de datos desde diferentes clases ?:
Hola ,ya probé el código que me diste y me da el siguiente error:
QSqlQuery::prepare: database not open
Bueno, ese código que puse es un ejemplo y lo copié a trozos de un proyecto que tengo en curso, no repasé que lo que puse fuese lo mínimo imprescindible para conectar.
Si quieres pon el código completo que lo mire a ver.
Un saludo.
-
Hola
@Ricardo.A said in Cómo puedo crear dos conexiones a una misma base de datos desde diferentes clases ?:
Ok, dime donde te puedo enviar el código completo, es que es algo extenso, dime como hago y te mando todo el proyecto, gracias por tu tiempo.
Yo me refería al trozo de código que hiciste basado en lo que yo te puse y te daba error. El proyecto completo no me comprometo a mirártelo pues apenas tengo tiempo libre y es algo que puede llevar un rato.
De todas formas sigo (o seguimos) sin saber cual es tu problema, en le post original preguntabas como acceder a la base de datos desde diferentes clases, yo te puse como lo hago yo, y tu pusiste lo que estabas haciendo, que es básicamente lo mismo que hago yo, entonces ¿cual es el problema? ¿tienes errores?
EDITO:
Veo que en post original dices:como puedo mediante la UI de classQ conectarme a una base de datos unica para las dos sin que en classT me diga que ya hay una conneccion existente
¿Estás usando en cada una de las dos clases el método QSqlDatabase::addDatabase? Lama a ese método en el main de tu proyecto y establece ahí la conexión con la base de datos. Luego, en cada clase que quieras acceder a la base de datos solo tienes que llamar a QSqlDatabase::database para obtener una referencia a la conexión que creaste en el main, debe de funcionarte, es como se hace.
Un saludo