Ciao ragazzi, per alcuni motivi sto realizzando un server tcp con le synapse per effettuare alcune operazioni da remoto. Tra queste esiste anche il controllo di alcuni dati su database firebird. Qui si complicano le cose. Mi va in crash il programma quando provo a fare questa operazione due volte. Sono su linux mint a 32 bit e non capisco perchè
An unhandled exception occurred at $B66975F5 :
EAccessViolation : Access violation
$B66975F5
Un po di codice:
function TTCPEchoThrd.ApriConnessioneAlDB(var Conn: TIBConnection; var Tran: TSQLTransaction; MyHostName: string; MyDataBaseName: string; MyUserName: string; MyPassword: string; var MsgError: string): boolean;
var
ret: boolean;
begin
try
try
ret:=true;
Conn.HostName:=MyHostName;
Conn.DatabaseName:=MyDataBaseName;
Conn.UserName:=MyUserName;
Conn.Password:=MyPassword;
Conn.Transaction:=Tran;
Conn.Open;
Tran.Active:=true;
//ho ottenuto la connessione al database
finally
//codice da effettuare a fine procedura sia che va bene il codice sopra sia che il codice ha sollevato un'eccezzione
end;
except
on E: Exception do
begin
MsgError:=E.Message;
ret:=false;
end;
end;
result:=ret;
end;
function TTCPEchoThrd.ChiudiConnessioneAlDB(var Conn: TIBConnection;
var Tran: TSQLTransaction; var MsgError: string): boolean;
var
ret: boolean;
begin
try
try
ret:=true;
Conn.Close();
finally
end;
except
on E: Exception do
begin
MsgError:=E.Message;
ret:=false;
end;
end;
result:=ret;
end;
Il codice che crea problemi è il seguente
function TTCPEchoThrd.UtenteAbilitato(NomeUtente: string; Id_Utente: string):boolean;
var
Conn: TIBConnection;
Tran: TSQLTransaction;
Query: TSQLQuery;
ErrMes: string;
ret: boolean;
begin
try
try
Conn:=TIBConnection.Create(nil);
Tran:=TSQLTransaction.Create(nil);
if (Self.ApriConnessioneAlDB(Conn,Tran,'127.0.0.1','/DB/db.fdb','user','pwd',ErrMes)=true) then
begin
ret:=false;
Self.CredenzialiOK:=false;
Self.Log(' CONNESSIONE AL DB EFFETTUATA');
Query:=TSQLQuery.Create(nil);
Query.DataBase:=Conn;
Query.SQL.Text:='select PATH from T_User WHERE ID=:Id and Nome=:User';
Query.Params.ParamByName('Id').AsInteger := StrToInt(Id_Utente);
Query.Params.ParamByName('User').AsString := NomeUtente;
Query.Open;
if not Query.EOF then
begin
Query.First;
Self.DataBaseDellUtenteRemoto:=Trim(Query.FieldByName('PATH').AsString);
if ((Length(Self.DataBaseDellUtenteRemoto)>0) and (FileExists(Self.DataBaseDellUtenteRemoto))) then
begin
ret:=true;
Self.CredenzialiOK:=true;
end;
end;
Query.Close;
Query.Free;
Self.ChiudiConnessioneAlDB(Conn,Tran,ErrMes);
Self.Log(' CONNESSIONE AL DB CHIUSA');
end
else
begin
Self.Log('ERRORE ' + ErrMes);
end;
finally
//codice da effettuare a fine procedura sia che va bene il codice sopra sia che il codice ha sollevato un'eccezzione
Tran.Free;
Conn.Free;
end;
except
on E: Exception do
begin
ret:=false;
Self.Log('ERRORE ' + E.Message);
end;
end;
result:=ret;
end;
Idee?