Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: xinyiman - Maggio 27, 2015, 12:24:18 pm

Titolo: Connessione a Firebird
Inserito da: xinyiman - Maggio 27, 2015, 12:24:18 pm
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:

Codice: [Seleziona]
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

Codice: [Seleziona]
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?
Titolo: Re:Connessione a Firebird
Inserito da: nomorelogic - Maggio 29, 2015, 10:46:10 pm
qual è l'istruzione che da l'access violation?
Titolo: Re:Connessione a Firebird
Inserito da: xinyiman - Maggio 30, 2015, 07:59:04 am
Sembrerebbe che accade quando vado a fare la open della connessione alla seconda volta

AproConnessione
ChiudoConnessione
AproConnessione <-- qui si crea il problema
Titolo: Re:Connessione a Firebird
Inserito da: nomorelogic - Maggio 30, 2015, 11:02:49 am
hai già provato a mettere un breakpoint sull'istruzione
Codice: [Seleziona]
Conn.Open;

per vedere se la connessione e la transazione sono 2 puntatori validi (cioè<> nil)?
Controlla anche che Conn.Transaction sia assegnato.
Titolo: Re:Connessione a Firebird
Inserito da: xinyiman - Maggio 30, 2015, 02:23:21 pm
Si tutti i test fatti. Per risolvere ho dovuto usare zeos  :(