Driver ODBC e VO
Posted: Sun Oct 24, 2021 2:36 pm
Salve a tutti
Nel programma per il quale vi chiedo aiuto, utilizzo VO, come database MySQL connesso tramite "ODBC 8.0 ANSI Driver a 32 bit".
Ho una transazione MySQL che mi sta dando saltuariamente dei problemi. Se eseguo la stessa transazione tramite Workbench viene eseguita senza nessun problema.
All'interno del programma ho decine di transazioni simili e nessuna mi sta dando problemi.
Questa è la Stored Procedure che richiamo:
------------------------------------------
CREATE DEFINER=`root`@`localhost` PROCEDURE `RientroLibro3`(in IdRec INT, in DataReso char(12), in P_ISBN char(13))
BEGIN
START TRANSACTION;
UPDATE `biblioteca`.`libri_alunno`
SET `reso` = DataReso
WHERE (`idlibri_alunno` = IdRec);
INSERT INTO biblioteca.giacenza (ISBN, giacenza) VALUES (P_ISBN, 1)
ON DUPLICATE KEY UPDATE giacenza = giacenza + 1;
COMMIT;
END
--------------------------------------
Queste sono le righe di programma incriminate in cui richiamo la procedura:
-------------------------------------
METHOD ConfermaUno(Multiplo as LOGIC)
local DataConsegna as string
local NumeroRecord as string
local cISBN as string
local sLibClass as string
local sClassCer as string
local nProve as int
// Preparazione parametri Stored Procedure
NumeroRecord := LTrim(Transform(SELF:oLibri:FIELDGET(#IDREC), "9999999999"))
cISBN := AllTrim(SELF:oLibri:FIELDGET(#ISBN))
SetDateCountry(ANSI)
DataConsegna := StrTran(dtoc(oDCDatCons:value), ".", "-")
SetDateCountry(ITALIAN)
nProve = 0 // Conteggio delle riprove
cConnAs1 := "call biblioteca.RestituzionePrestito(?, ?, ?);"
DO WHILE TRUE
oSelectAs1 := SQLSelect{cConnAs1, oConnAs1}
oSelectAs1:Execute(NumeroRecord, DataConsegna, cISBN)
IF oSelectAs1:Status = NULL_OBJECT
InfoBox{self, "Informazione:"+ Str(nProve, 2, 0), "La restituzione del testo è avvenuta correttamente"}:Show()
EXIT
ELSE
nProve ++
if nProve < 10
SELF:oSelectAs1:FreeStmt(SQL_DROP)
Aspetta(1.0)
loop
endif
ErrorBox{SELF, "Errore: RetituzionePrestito("+ Str(nProve, 2, 0)+") " + CHR(10) + ;
oSelectAs1:Status:HelpContext + CHR(10) + ;
oSelectAs1:Status:Description + CHR(10) + ;
oSelectAs1:Status:Caption}:Show()
exit
ENDIF
ENDDO
SELF:oSelectAs1:FreeStmt(SQL_DROP)
RETURN NIL
/*----------------------------*/
METHOD Aspetta(nTempo as float)
LOCAL nStart AS FLOAT
LOCAL lContinua := TRUE AS LOGIC
nStart := Seconds()
DO WHILE lContinua
lContinua := (Seconds() - nStart) < nTempo
ENDDO
RETURN NIL
--------------------------------------
Questo è l'errore che mi dava:
[MySQL] [ODBC 8.0(a) Driver][mysql-8.0.18] Commads out of sync; you can't run this command now
nel momento in cui esegue la riga: oSelectAs1:Execute(NumeroRecord, DataConsegna, cISBN)
Come vedete ho dovuto fare un ciclo di tentativi per essere sicuro che eseguisse la SP, e, dalle prove che ho fatto, massimo è arrivato al terzo tentativo.
Il fatto che la stessa transazione con gli stessi parametri viene poi eseguita senza mai un problema su Workbench mi fa pensare che il driver ODBC, forse, dovrebbe essere parametrizzato in maniera più accurata.
Qualcuno può aiutarmi?
Grazie a tutti
Claudio
Nel programma per il quale vi chiedo aiuto, utilizzo VO, come database MySQL connesso tramite "ODBC 8.0 ANSI Driver a 32 bit".
Ho una transazione MySQL che mi sta dando saltuariamente dei problemi. Se eseguo la stessa transazione tramite Workbench viene eseguita senza nessun problema.
All'interno del programma ho decine di transazioni simili e nessuna mi sta dando problemi.
Questa è la Stored Procedure che richiamo:
------------------------------------------
CREATE DEFINER=`root`@`localhost` PROCEDURE `RientroLibro3`(in IdRec INT, in DataReso char(12), in P_ISBN char(13))
BEGIN
START TRANSACTION;
UPDATE `biblioteca`.`libri_alunno`
SET `reso` = DataReso
WHERE (`idlibri_alunno` = IdRec);
INSERT INTO biblioteca.giacenza (ISBN, giacenza) VALUES (P_ISBN, 1)
ON DUPLICATE KEY UPDATE giacenza = giacenza + 1;
COMMIT;
END
--------------------------------------
Queste sono le righe di programma incriminate in cui richiamo la procedura:
-------------------------------------
METHOD ConfermaUno(Multiplo as LOGIC)
local DataConsegna as string
local NumeroRecord as string
local cISBN as string
local sLibClass as string
local sClassCer as string
local nProve as int
// Preparazione parametri Stored Procedure
NumeroRecord := LTrim(Transform(SELF:oLibri:FIELDGET(#IDREC), "9999999999"))
cISBN := AllTrim(SELF:oLibri:FIELDGET(#ISBN))
SetDateCountry(ANSI)
DataConsegna := StrTran(dtoc(oDCDatCons:value), ".", "-")
SetDateCountry(ITALIAN)
nProve = 0 // Conteggio delle riprove
cConnAs1 := "call biblioteca.RestituzionePrestito(?, ?, ?);"
DO WHILE TRUE
oSelectAs1 := SQLSelect{cConnAs1, oConnAs1}
oSelectAs1:Execute(NumeroRecord, DataConsegna, cISBN)
IF oSelectAs1:Status = NULL_OBJECT
InfoBox{self, "Informazione:"+ Str(nProve, 2, 0), "La restituzione del testo è avvenuta correttamente"}:Show()
EXIT
ELSE
nProve ++
if nProve < 10
SELF:oSelectAs1:FreeStmt(SQL_DROP)
Aspetta(1.0)
loop
endif
ErrorBox{SELF, "Errore: RetituzionePrestito("+ Str(nProve, 2, 0)+") " + CHR(10) + ;
oSelectAs1:Status:HelpContext + CHR(10) + ;
oSelectAs1:Status:Description + CHR(10) + ;
oSelectAs1:Status:Caption}:Show()
exit
ENDIF
ENDDO
SELF:oSelectAs1:FreeStmt(SQL_DROP)
RETURN NIL
/*----------------------------*/
METHOD Aspetta(nTempo as float)
LOCAL nStart AS FLOAT
LOCAL lContinua := TRUE AS LOGIC
nStart := Seconds()
DO WHILE lContinua
lContinua := (Seconds() - nStart) < nTempo
ENDDO
RETURN NIL
--------------------------------------
Questo è l'errore che mi dava:
[MySQL] [ODBC 8.0(a) Driver][mysql-8.0.18] Commads out of sync; you can't run this command now
nel momento in cui esegue la riga: oSelectAs1:Execute(NumeroRecord, DataConsegna, cISBN)
Come vedete ho dovuto fare un ciclo di tentativi per essere sicuro che eseguisse la SP, e, dalle prove che ho fatto, massimo è arrivato al terzo tentativo.
Il fatto che la stessa transazione con gli stessi parametri viene poi eseguita senza mai un problema su Workbench mi fa pensare che il driver ODBC, forse, dovrebbe essere parametrizzato in maniera più accurata.
Qualcuno può aiutarmi?
Grazie a tutti
Claudio