Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Spanish
  4. Cómo puedo crear dos conexiones a una misma base de datos desde diferentes clases ?

Cómo puedo crear dos conexiones a una misma base de datos desde diferentes clases ?

Scheduled Pinned Locked Moved Unsolved Spanish
9 Posts 2 Posters 3.5k 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.
  • R Offline
    R Offline
    Ricardo.A
    wrote on last edited by
    #1

    Veran tengo dos clases digamos classQ y classT, 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

    1 Reply Last reply
    0
    • juankiJ Offline
      juankiJ Offline
      juanki
      Moderators
      wrote on last edited by
      #2

      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

      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
      0
      • R Offline
        R Offline
        Ricardo.A
        wrote on last edited by
        #3

        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...";
        }

        1 Reply Last reply
        0
        • R Offline
          R Offline
          Ricardo.A
          wrote on last edited by
          #4

          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

          1 Reply Last reply
          0
          • R Offline
            R Offline
            Ricardo.A
            wrote on last edited by
            #5

            Hola ,ya probé el código que me diste y me da el siguiente error:

            QSqlQuery::prepare: database not open

            Saludos.

            juankiJ 1 Reply Last reply
            0
            • R Ricardo.A

              Hola ,ya probé el código que me diste y me da el siguiente error:

              QSqlQuery::prepare: database not open

              Saludos.

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

              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.

              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
              0
              • R Offline
                R Offline
                Ricardo.A
                wrote on last edited by
                #7

                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.
                Saludos

                juankiJ 1 Reply Last reply
                0
                • R Ricardo.A

                  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.
                  Saludos

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

                  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

                  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
                  0
                  • R Offline
                    R Offline
                    Ricardo.A
                    wrote on last edited by
                    #9

                    OK gracias lo hago y te digo, muchas gracias, saludos

                    1 Reply Last reply
                    0

                    • Login

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