Unsolved 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.
- Avere query in un file di testo e' una gigantesca vulnerabilita' del tuo sistema
- 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
- creo una cartella
-
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;