Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Problema con esecuzione query di update



  • ciao!

    ho un programma che effettua diverse operazioni su un db Oracle..
    tra le quali questa funzione, che 4 mesi fa ha funzionato, mentre oggi non funziona.

    void PrioritaWindow::onBtnModificaClicked() {
        if (ui->baseTable->rowCount() > 0) {
            pd.open(this, "Loading...", true);
            if (db->isOpened()) {
                for (int i = 0; i < ui->baseTable->rowCount(); i++) {
                    QFile queryFile("TXT/set_priorita.txt");
                    queryFile.open(QFile::ReadOnly | QFile::Text);
                    QString strQuery = QTextStream(&queryFile).readAll();
                    strQuery.replace("\n", "");
                    db->transaction();
                    QSqlQuery query;
                    query.prepare(strQuery);
                    query.bindValue(0, ui->baseTable->item(i, 1)->text());
                    query.bindValue(1, ui->baseTable->item(i, 0)->text());
                    query.exec();
                    db->commit();
    
                    qDebug() << query.lastQuery();
                    qDebug() << query.lastError();
    
                    query.clear();
                }
                //ui->baseTable->setRowCount(0);
                btnModifica->setEnabled(false);
                btnClear->setEnabled(false);
                pd.close();
            } else {
                pd.close();
                this->errorBox("Controllare la connessione!");
            }
        } else {
            this->errorBox("Caricare un file CSV prima!");
        }
    }
       
    

    dai due qDebug mi esce questo:

    "UPDATE CCOMCL_ATTRIB_ESTESI SET VALORE = ? WHERE DITCONTI = 'XXL' AND CODICE_ATTR = 'CI-PRIORITA' AND CHIAVE =  'CL' || ? || '01.01.1000'"
    QSqlError("", "", "")
    

    in sostanza sembra che esegua la query, ma nel db non ci sono risultati.
    qualche idea?



  • elimina

    query.exec();
    db->commit();
    qDebug() << query.lastQuery();
    qDebug() << query.lastError();
    

    e sostituiscilo con:

    if(query.exec()){
    Q_ASSUME(db->commit());
    qDebug() << query.lastQuery();
    }
    else{
    qDebug() << query.lastQuery();
    qDebug() << query.lastError();
    Q_ASSUME(db->rollbcak());
    }
    

    e dicci cosa viene messo in console

    P.S.

    1. Avere query in un file di testo e' una gigantesca vulnerabilita' del tuo sistema
    2. sei sicuro di QFile queryFile("TXT/set_priorita.txt");? TXT/set_priorita.txt e' relativo alla working directory da cui fai partire il programma. sei certo questo e' quello che vuoi?


  • ciao!

    scusa il ritardo, ma ho dovuto fare qualche prova, perchè non si capiva bene se eseguiva la query o meno.
    ho fatto qualche modifica alla query e controllato il db.
    alla fine sembra tutto ok.

    PS: per quanto riguarda il discorso della query su file, si lo so che non è sicuro; l'ho fatto perchè mi veniva comodo e perchè:

    • il server non è esposto al di fuori della rete aziendale in nessun modo
    • il programma quindi al di fuori del mio pc aziendale non funziona
    • il programma è disponibile solo per e un paio di colleghi
      tutto sommato, costi / benefici, per ora mi va bene così!


  • Piu' della meta' degli attacchi informatici arrivano dall'interno, il caso tipico e' "tu mi licenzi, io ti droppo il database". Tu lo stai rendendo molto facile sia da eseguire che da nascondere le tracce



  • si sempre sul mio pc deve passare però (firewall esterno, firewall vpn, firewall mio pc con linux che deve essere acceso, password parecchio strong, deve trovare i path corretti dei file).
    se ci riesce tanto di cappello!

    cmq accetto il consiglio, e quando trovo una soluzione mi dia questa felssibilità e più sicurezza, di sicuro la adotterò!!



  • @fermatqt said in Problema con esecuzione query di update:

    si sempre sul mio pc deve passare però

    Nope. vedi punto 2 del P.S.



  • si si è relativo alla working directory.
    quella cartella TXT esiste solo dove c'è il mio eseguibile.
    non è sul server, te lo garantisco.



  • @fermatqt said in Problema con esecuzione query di update:

    si si è relativo alla working directory

    Esatto.

    • creo una cartella C:\Temp\TXT
    • al suo interno creo set_priorita.txt
    • scrivo dentro al file di testo DROP TABLE CCOMCL_ATTRIB_ESTESI;
    • apro il teminale (cmd.exe)
    • cd C:\Temp
    • C:\Programmi\MioProgramma\ProgrammaConVunerabilita.exe
    • il tuo db ha perso 1 tabella


  • però scusami eh:

    • le query sono tutte con PREPARED STATEMENT, quindi quell'istruzione andrebbe in errore, in quanto non gli passo nessun parametro (o almeno a me a sempre dato errore se il numero di parametri non esattamente uguale a quello nelle query)
    • non esiste un eseguibile per windows
    • il binario (per linux) è solo sul mio pc!! quindi dovrebbe prima "rubarmelo" (che sta dietro ai firewall, e questi giorni è anche spento ad esempio)

    quindi, partendo dal presupposto che come ho già detto tu hai ragione ed è una cosa che cercherò di modificare quando troverò una soluzione più sicura ma cmq flessibile, non la vedo così facile come dici te!

    inoltre, nella mia azienda, sono l'unico informatico.
    nessuno sa manco cosa sia l'SQL e l'istruzione DROP :D :D :D



  • @fermatqt said in Problema con esecuzione query di update:

    andrebbe in errore, in quanto non gli passo nessun parametro

    vero ma e' facilmente solvibile:
    UPDATE CCOMCL_ATTRIB_ESTESI SET VALORE = ? WHERE DITCONTI = 'XXL' AND CODICE_ATTR = 'CI-PRIORITA' AND CHIAVE = 'CL' || ? || '01.01.1000'; DROP TABLE CCOMCL_ATTRIB_ESTESI;


Log in to reply