Piu' che lazarus questa e' una domanda che coinvolge il pascal
Ciao, sto facendo un ciclo per inserire in una tabella alcuni dati mancanti
s := 'select * from tabapp';
MySql3.SQL.Text := S;
MySql3.open;
if not(Mysql3.EOF) then
begin
S1:='select etposi from altratab where campo = ''';
S1:= S1 + MySQL3.FieldByName('SPED').AsString + '''';
MySql1.SQL.Text := S1;
MySql1.open;
if not(Mysql1.EOF) then
begin
S2:='UPDATE TABAPP SET posizione = ''' + copy(MySQL1.FieldByName('etposi').AsString, 1, 15) + ''' ';
S2:= S2 + 'WHERE SPEDIZIONE = ''' + MySQL3.FieldByName('SPEDIZIONE').AsString + '''';
MySql4.SQL.Text := S2;
Mysql4.Execsql;
Mysql4.sql.clear;
Mytrans4.Commit;
Mysql4.close;
end;
MySql4.Next;
end;
il problema e' che mi da errore deadlock quando vado a fare l'update.
MySQL3 e MySQL4 sono due TSQLQuery dello stesso db.
Li ho configurati così:
Mydb3.Databasename := 'D:db.fdb';
Mydb3.UserName := 'SYSDBA';
MyDb3.PassWord := 'masterkey';
MyDb3.Transaction := MyTrans3;
MyDb3.Connected := True;
MyTrans3.DataBase := MyDb3;
MyTrans3.active := true;
MySql3.Database :=Mydb3;
MySql3.Transaction := MyTrans3;
Mysql3.ReadOnly := false;
MyTrans4 := TSQLTransaction.Create(Nil);
MySql4:= TSQLQuery.Create(Nil);
MyTrans4.DataBase := MyDb3;
MyTrans4.active := true;
MySql4.Database :=Mydb3;
MySql4.Transaction := MyTrans4;
Mysql4.ReadOnly := false;
Come posso risolvere l'errore?
ciao,
ho provato anche senza la close ma l'errore rimane
Ho provato anche a spostare la commit di mysql4 fuori dal ciclo ma niente da fare
per il sorgente ti invio solo la parte interessata : non ho problemi a mandartelo tutto ma fa collegamenti anche ad altri db (ad esempio as400) e sarebbe difficile riprodurre tutta la situazione
procedure TForm1.CmdEseguiClick(Sender: TObject);
var
S, S1, S2, Buffer, Linea, numfat, saltavar, collo, codsp: String;
MyDb1: TODBCConnection;
MyDb2: TIBConnection;
MyDb3: TIBConnection;
MyTrans1, MyTrans2, MyTrans3, MyTrans4: TSQLTransaction;
MySql1, MySQL2, MySQL3, MySQL4: TSQLQuery;
TxtF : TextFile;
Cont: integer;
importo: real;
MyDb3:= TIBConnection.Create(Nil);
MyTrans3 := TSQLTransaction.Create(Nil);
MySql3:= TSQLQuery.Create(Nil);
Mydb3.Databasename := 'D:\Euroservice\Archivi\db.fdb';
Mydb3.UserName := 'SYSDBA';
MyDb3.PassWord := 'masterkey';
MyDb3.Transaction := MyTrans3;
MyDb3.Connected := True;
MyTrans3.DataBase := MyDb3;
MyTrans3.active := true;
MySql3.Database :=Mydb3;
MySql3.Transaction := MyTrans3;
Mysql3.ReadOnly := false;
MyTrans4 := TSQLTransaction.Create(Nil);
MySql4:= TSQLQuery.Create(Nil);
MyTrans4.DataBase := MyDb3;
MyTrans4.active := true;
MySql4.Database :=Mydb3;
MySql4.Transaction := MyTrans4;
Mysql4.ReadOnly := false;
Mysql3.UpdateMode:=upWhereAll;
Mysql4.UpdateMode:=upWhereAll;
s := 'select * from tabapp';
MySql3.SQL.Text := S;
MySql3.open;
if not(Mysql3.EOF) then
begin
S1:='select etposi from tabesterna where SUBSTRING(ETCDLI, 1, 1) = ''J'' AND ETIDCT = ''';
S1:= S1 + MySQL3.FieldByName('SPEDIZIONE').AsString + '''';
MySql1.SQL.Text := S1;
MySql1.open;
if not(Mysql1.EOF) then
begin
S2:='UPDATE TABAPP SET posizione = ''' + copy(MySQL1.FieldByName('etposi').AsString, 1, 15) + ''' ';
S2:= S2 + 'WHERE SPEDIZIONE = ''' + MySQL3.FieldByName('SPEDIZIONE').AsString + '''';
MySql4.SQL.Text := S2;
Mysql4.Execsql;
Mysql4.sql.clear;
Mytrans4.Commit;
Mysql4.close;
end;
MySql4.Next;
end;
end;
Praticamente a posto della lettura di un campo su tabesterna com MySQL1 si puo' inserire direttamente una costante (commentando le istruzioni di lettura di MySQL1 e inserendo la costante dentro alla funzione copy()) e l'errore dovrebbe rimanere ugualmente
Id db e' con firebird 2.5 e la tabella tabapp e' la seguente:
SPEDIZIONE varchar(10)
IMPORTO float
POSIZIONE varchar(10)
L'errore e' il seguente:
Project gls raised exception class 'EIBDatabaseError' with message:
: Execute :
- deadlock
- update clonflicts with concurrent update
- concurrent transaction number is 5455