[Resuelto] QSqlDatabase: Insertar valores de una base de datos a otra



  • Hola a todos,

    Estoy intentando seleccionar unos datos de una tabla de una base de datos para insertarlos en una tabla de otra base de datos.
    Aclaraciones:

    • La tabla de la que se extrae la información es Partes de la base de datos Hospital
    • La tabla en la que se quiere insertar los datos es Solicitudes_Trabajo de la base de datos Empresa
    • Mediante "seleccionar2" se extraen todos los datos vinculados a la ID que el usuario ha escrito en el lineEdit. Estos datos pertenecen a la tabla Partes de la base de datos Hospital.
    • Mediante "guardar_s2" se intenta escoger (de entre los datos extraidos con "seleccionar2") los datos N_Solicitud y Fecha_Emision que pertenecen a la base de datos Hospital y corresponden a la ID escrita por el usuario, para después guardarlos en la tabla Solicitudes_Trabajo de la base de datos Empresa.
            hospital=QSqlDatabase::addDatabase("QSQLITE");
            hospital.setDatabaseName("C:/Sqlite3/Hospital.sqlite");
    
            if(hospital.open()){
                qDebug()<<"11.Se ha conectado a la base de datos Hospital";
            }else{
                qDebug()<<"11.ERROR. No se ha conectado a la base de datos Hospital";
            }
    
                QSqlQuery seleccionar2;
                seleccionar2.prepare("SELECT*FROM Partes WHERE N_Parte=:ID");
                seleccionar2.bindValue(":ID",ui->lineEditN_Parte->text());
    
                    if(seleccionar2.exec())
                    {
                        qDebug()<<"12.Los datos del parte se han seleccionado correctamente";
                    }else{
                        qDebug()<<"12.ERROR. Los datos del parte no se han seleccionado correctamente";
                        qDebug()<<"12.ERROR:"<<seleccionar2.lastError();
                    }
    
                    seleccionar2.next();
    
    //-----------------------------------------------------------------
    //-----------------------------------------------------------------
    //-----------------------------------------------------------------
    
    QSqlQuery guardar_s2;
            guardar_s2.prepare("INSERT INTO Solicitudes_Trabajo (N_Solicitud, Fecha_Emision) "
                          "VALUES (:N_Solicitud, :Fecha_Emision)");
            guardar_s2.bindValue(":N_Solicitud", seleccionar2.value(0).toByteArray().constData());
            guardar_s2.bindValue(":Fecha_Emision", seleccionar2.value(1).toByteArray().constData());
    
                if(guardar_s2.exec( ))
                {
                    ui->label_Guardar->setText("Solicitud guardada correctamente");
                    qDebug()<<"13.Los datos del parte se han guardado en la Solicitud de Trabajo";
                }
                else
                {
                    ui->label_Guardar->setText("La solicitud no se ha guardado correctamente");
                    qDebug()<<"13.ERROR. Los datos del parte no se han guardado en la Solicitud de Trabajo";
                    qDebug()<<"13.ERROR:"<<guardar_s2.lastError();
                }
    

    Esto da`como resultado el error:
    13.ERROR. Los datos del parte no se han guardado en la Solicitud de Trabajo
    13.ERROR: QSqlError("", "Parameter count mismatch", "")
    Ya que la base de datos que está abierta en el momento de insertar los datos es Hospital y no Empresa que es donde se deben insertar.

    Uno de mis intentos por solucionarlo ha sido volver a abrir la base de datos Empresa en el lugar en el que he indicado las 3 líneas de guiones, mediante este código:

                  empresa=QSqlDatabase::addDatabase("QSQLITE");
                  empresa.setDatabaseName("C:/Sqlite3/Empresa.sqlite");
    
                  if(empresa.open()){
                      qDebug()<<"8.Se ha conectado a la base de datos Empresa";
                  }else{
                      qDebug()<<"8.ERROR. No se ha conectado a la base de datos Empresa";
                  }
    

    Pero como era de esperar no ha dado resultado.

    Se me ocurre como posible solución guardar el valor del: seleccionar2.value(0).toByteArray().constData() en una variable que no necesitase del acceso a la base de datos, pero no sé como se podría guardar este valor en una variable.

    ¿Alguien podría ayudarme con esta posible solución de guardar el valor en una variable?

    ¿A alguien se le ocurre una idea mejor?

    Muchas gracias!



  • Hola

    Nunca he trabajado con dos bases de datos en el mismo programa, pero creo que necesitarás dos conexiones diferentes, una a cada una de las bases de datos:

    // conexión con la primera base de datos
    QSqlDatabase db_1 = QSqlDatabase::addDatabase("QSQLITE", "conexion_db_1");
    db.setDatabaseName("...");
    
    // conexión con la segunda  base de dato
    QSqlDatabase db_2 = QSqlDatabase::addDatabase("QSQLITE", "conexion_db_2");
    db.setDatabaseName("...");
    

    Y luego, a la hora de hacer los querys, usas cada una en el query adecuado:

    QSqlQuery consulta1(db_1);
    consulta.prepare("SELECT ...");
    
    QSqlQuery consulta2(db_2);
    consulta.prepare("INSERT ...");
    

    Ten cuenta que antes de insertar los datos que has sacado con el primer query deberás prepararlos para pasárselos al query2. Si son muchos mírate execBatch.

    Esto, como digo, no lo he probado, pero me imagino que debe ser más o menos así.

    Un saludo



  • Al final guardando cada valor de las dos bases de datos en QStrings funcionaba:

    QString _Telefono = seleccionar2.value(8).toByteArray().constData();
    QString _Tecnico_Asignado = seleccionar2.value(0).toByteArray().constData();
    QString _Estado_Solicitud = seleccionar2.value(7).toByteArray().constData();
    

    Así podía usar este código sin problema:

            QSqlQuery guardar_s;
                    guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (N_Solicitud, Fecha_Emision, Unidad_Hospitalaria,"
                                      "Codigo_Equipo, Equipo, Marca)"
                                      "VALUES (:N_Solicitud, :Fecha_Emision, :Unidad_Hospitalaria, :Codigo_Equipo, :Equipo,"
                                       ":Marca)");
                    guardar_s.bindValue(":N_Solicitud", _N_Solicitud);
                    guardar_s.bindValue(":Fecha_Emision", _Fecha_Emision);
                    guardar_s.bindValue(":Unidad_Hospitalaria", _Unidad_Hospitalaria);
                    guardar_s.bindValue(":Codigo_Equipo", _Codigo_Equipo);
                    guardar_s.bindValue(":Equipo", _Equipo);
                    guardar_s.bindValue(":Marca", _Marca);
    

    Insertaba los valores de las dos bases de datos en la base Empresa, pero si usaba este otro con más valores no funcionaba:

        QSqlQuery guardar_s;
        guardar_s.prepare("INSERT INTO Solicitudes_Trabajo (N_Solicitud, Fecha_Emision, Unidad_Hospitalaria, Codigo_Equipo,"
                          "Equipo, Marca, Modelo, N_Serie, Localizacion, Unidad_Tecnica, Peticionario, Telefono, "
                          "Descripcion_Solicitud, Tecnico_Asignado, Tipo_Solicitud, Estado_Solicitud) "
                      "VALUES (:N_Solicitud, :Fecha_Emision, :Unidad_Hospitalaria, :Codigo_Equipo, :Equipo, :Marca, :Modelo,"
                          ":N_Serie, :Localizacion, :Unidad_Tecnica, :Peticionario, :Telefono, :Descripcion_Solicitud,"
                          ":Tecnico_Asignado, :Tipo_Solicitud, :Estado_Solicitud)");
        guardar_s.bindValue(":N_Solicitud", _N_Solicitud);
        guardar_s.bindValue(":Fecha_Emision", _Fecha_Emision);
        guardar_s.bindValue(":Unidad_Hospitalaria",_Unidad_Hospitalaria);
        guardar_s.bindValue(":Codigo_Equipo", _Codigo_Equipo);
        guardar_s.bindValue(":Equipo", _Equipo);
        guardar_s.bindValue(":Marca", _Marca);
        guardar_s.bindValue(":Modelo", _Modelo);
        guardar_s.bindValue(":N_Serie", _N_Serie);
        guardar_s.bindValue(":Localizacion", _Localizacion);
        guardar_s.bindValue(":Unidad_Tecnica", _Unidad_Tecnica);
        guardar_s.bindValue(":Peticionario", _Peticionario);
        guardar_s.bindValue(":Telefono", _Telefono);
        guardar_s.bindValue(":Descripcion_Solicitud", _Descripcion_Solicitud);
        guardar_s.bindValue(":Tecnico_Asignado", _Tecnico_Asignado);
        guardar_s.bindValue(":Tipo_Solicitud", "a");
        guardar_s.bindValue(":Estado_Solicitud", _Estado_Solicitud);
    

    Me daba el error: 12.ERROR: QSqlError("", "Parameter count mismatch", "").

    Pensaba que quizás eran demasiados valores para Qt Creator. Pero al final, después de muchas pruebas me dí cuenta que estaba intentando insertar un valor en la columna existente Localización con un INSERT INTO Solicitudes_Trabajo (Localizacion).
    Lo explico por si a alguien más le sale ese mismo error que pruebe a revisar todos los campos y columnas en busca de algún pequeño fallo en alguna letra o alguna tilde.



Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.