Solved Problema con query e QSqlQuery prepare
-
si ma infatti è solo una prova.
non ho intenzione di usare la query così!cmq QSqlDriver::NamedPlaceholders mi da false, gli altri true.
quindi suppongo debba sempre usare ? e non :articoli.
se così, ho provato in questo modo:QString strQuery = "SELECT LT.DESCR128 DESCRIZIONE,LT.NUMERAT || LT.PERIODO || LPAD(LT.NUM, 6, '0') || LT.SERIE LISTINO,MA.CODINT ARTICOLO,LD.PRZDIVISA PREZZO,LD.SCONTO1 SCONTO1,LD.SCONTO2 SCONTO2,LD.SCONTO3 SCONTO3,LT.DAL DAL,LT.AL AL FROM LIST_OFF_DETT LD INNER JOIN MAT_ANAG MA ON MA.NPAM = LD.NPAM INNER JOIN LIST_OFF_TEST LT ON LT.NUMERAT = LD.NUMERAT AND LT.PERIODO = LD.PERIODO AND LT.NUM = LD.NUM AND LT.SERIE = LD.SERIE WHERE MA.DITMAT = 'XXL' AND MA.FVL = ' ' AND LT.DITTA = 'XXL' AND LT.FVL = ' ' AND LD.DITTA = 'XXL' AND LD.FVL = ' ' AND MA.CODINT = '?'"; QSqlQuery query; query.prepare(strQuery); query.bindValue(0, this->articolo); query.exec();
ma continuo ad avere zero record.
-
'?'
questo e' sbagliato, non devi mettere gli apostrofi, solo il?
@fermatqt said in Problema con query e QSqlQuery prepare:
quindi suppongo debba sempre usare ? e non :articoli.
corretto!
-
si quella con '?' era una prova.
cmq ho provato sia così:QString strQuery = ".............. MA.CODINT = ?"; QSqlQuery query; query.prepare(strQuery); query.addBindValue("C165-000");
che così:
QString strQuery = "........... MA.CODINT = ?"; QSqlQuery query; query.prepare(strQuery); query.bindValue(0, this->articolo);
non è che debba specificare di che tipo è il bindValue??
-
no, se
this->articolo
e' QString il tipo viene dedotto in automatico, devi specificare il tipo solo se vuoi passare l'equivalente di NULLproviamo con una query base:
QSqlQuery query; query.prepare("select * from MAT_ANAG where CODINT = ?"); query.bindValue(0, "C165-000"); if(query.exec()) { while(query.next()){ qDebug() << query.record().value("CODINT"); } } else{ qDebug() << query.lastError().text(); }
e dimmi se ti da risultati
-
ecco il codice:
qDebug() << "STARTED"; if (db->isOpened()) { QSqlQuery query; query.prepare("SELECT * FROM MAT_ANAG WHERE CODINT = ?"); query.bindValue(0, "C165-000"); if (query.exec()) { while (query.next()) { qDebug() << "CODINT: " << query.record().value("CODINT"); } } else { qDebug() << query.lastError().text(); } } else { qDebug() << "DB chiuso"; } qDebug() << "FINISHED";
una volta lanciato, il programma lavora per circa 5 secondi.
quindi penso voglia dire che la query la sta eseguendo
ma l'output è solo questo:STARTED FINISHED
inoltre, se scrivessi una query appositamente errata (ad esempio SELEC e non SELECT) vedrei l'errore in console.
quindi anche la query dovrebbe essere giusta.infine se uso il LIKE funziona:
qDebug() << "STARTED"; if (db->isOpened()) { QSqlQuery query; query.prepare("SELECT * FROM MAT_ANAG WHERE CODINT LIKE ?"); query.bindValue(0, "C165-000%"); if (query.exec()) { while (query.next()) { qDebug() << "CODINT: " << query.record().value("CODINT"); } } else { qDebug() << query.lastError().text(); } } else { qDebug() << "DB chiuso"; } qDebug() << "FINISHED";
-
a questo punto sono convinto che il problema sia nei dati, non nella query.
Prova una cosa. usa la query con il like ma sostituisci
qDebug() << "CODINT: " << query.record().value("CODINT");
conqDebug() << "CODINT: " << query.record().value("CODINT").toString().size();
se stampa 8 mi bevo un'intera bottiglia di vodka in un sol fiato! -
purtroppo niente vodka, ti avrei fatto volentieri compagni con il gin!
questo il codice:
qDebug() << "STARTED"; if (db->isOpened()) { QSqlQuery query; query.prepare("SELECT * FROM MAT_ANAG WHERE CODINT LIKE ?"); query.bindValue(0, "C165-000%"); if (query.exec()) { while (query.next()) { qDebug() << "CODINT: " << query.record().value("CODINT").toString().size(); } } else { qDebug() << query.lastError().text(); } } else { qDebug() << "DB chiuso"; } qDebug() << "FINISHED";
questo l'output:
STARTED CODINT: 30 CODINT: 30 CODINT: 30 CODINT: 30 .................... FINISHED
ho controllato sul db il tipo di campo:
CODINT NOT NULL CHAR(30) -
@fermatqt said in Problema con query e QSqlQuery prepare:
MA.CODINT è un VARCHAR
Mi hai mentito! :)
quindi
SELECT TRIM(CODINT) tc FROM MAT_ANAG WHERE tc = ?
dovrebbe funzionare -
scusa ero sicuro che fosse un VARCHAR!!
ma più che altro su mysql non mi sembra di riscontrare questo comportamento che ho su oracle (ma magari mi sbaglio).cmq col TRIM funziona.
grazie mille, ti devo una bottiglia di vodka!!
-
Nessun problem, felice che si sia risolto