Queste sono le query che io eseguo per copiare un record in tabella temporanea (nel mio applicativo in realtà copio più records legati in maniera gerarchica su più livelli), modificarne un campo e poi reinserirlo nella tabella di partenza :
1 - CREATE OR REPLACE TEMPORARY TABLE QTOU SELECT * FROM QTOU_Headers WHERE Id_Quotation = 5665;
2 - UPDATE QTOU SET ID_Quotation=0; ## Change the unique key
3 - UPDATE QTOU SET QT_QuoteNumber = '2020-999QT';
4 - INSERT INTO QTOU_Headers SELECT * FROM QTOU;
5 - DROP TABLE QTOU; -> Richiede Privilegio Drop (alternativa MariaDB : aggiungere OR REPLACE nel CREATE TABLE)
1- Per MariaDb si può usare l'opzione Or Replace che evita di dover avere i privilegi di Drop sulla tabella temporanea (non mi sembra che sia disponibile con MySQL)
2- Azzera la chiave nella tabella temporanea (è un campo autoincrement) : costringe la generazione del nuovo ID (quando copiato nella tabella di partenza)
3- Aggiorna altri campi della tabella temporanea
4- Copia record da tabella temporanea a tabella di partenza
5- (facoltativo) elimina la tabella temporanea
Le query possono essere eseguite in sequenza su una connessione ADO globale aperta :
gAdoCnn.Execute (mSQLCreate), mRecAffected
gAdoCnn.Execute (mSQLUpdate), mRecAffected
gAdoCnn.Execute (mSQLInsert), mRecAffected
'mSQLCreate, mSQLUpdate e mSQLInsert contengono le query 1,2/3, 4
oppure possono inviate tutte in un unico comando (valido solo per driver ODBC MySQL e non per MariaDB a patto che nella connessione ODBC sia stato abilitato il parametro MultiStatement) :
gAdoCnn.Execute (mSQLCopyOneRecord), mRecAffected
'mSQLCopyOneRecord contiene la concatenzaione delle precedenti query ovviamente ciascuna terminata dal ;
Per recuperare il Last Insert ID (utile in caso di chiave di tipo AutoIncrement) occorre eseguire questa query sull'oggetto connection e farsi restituire un recordset :
Dim ArLog As ADODB.Recordset
Dim sSql As String
sSql = "SELECT IF(ROW_COUNT() > 0, LAST_INSERT_ID(), 0);"
Set ArLog = gAdoCnn.Execute(sSql)
If Not ArLog.EOF Then
vNewKey = ArLog(0)
Else
vNewKey = 0
End If
' clean up
ArLog.Close
Set ArLog = Nothing
'sSql = "SELECT LAST_INSERT_ID();" 'Non sicura : se qualcosa fallisce restituisce comunque l'ultimo Last_Insert_ID andato a buon fine
La tabella temporanea viene eliminata automaticamente alla chiusura della connessione quindi dovrebbe essere disponibile per le query utilizzando la stessa connessione.
13/02/2025 - Catafirro ha scritto:
Non sono riuscito a farle funzionare nelle query pass-throught, dove ne avrei avuto bisogno. Ho una connessione globale che inizializzo quando entro nell'applicativo, e su quella istanzio tutti i miei bravi recordset ADO. Sempre su quella connessione genero una tabella temporanea che posso riempire con un recordset ADO, che condivide la connessione. Ma le query pass-throught, dove dovrei usarla, non la vedono. Non so se c'è il modo di fargli condividere la connessione globale, io non l'ho trovato, anche se, a dire il vero, non ci ho perso troppo tempo.
Resta da verificare se sia disponibile (visibile) anche per le query PT ... ma mi sembrerebbe strano che non lo sia ... mostra eventualmente del codice.