Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: Stefano - Marzo 13, 2013, 06:12:17 pm

Titolo: [RISOLTO]Transaction SqlDb + Firebird
Inserito da: Stefano - Marzo 13, 2013, 06:12:17 pm
Mi viene sollevata eccezione "il progetto ... un'eccezione di classe SIGSEGV"
cercando di eseguire Commit
La Transazione e' attiva -> SQLTransaction.Active := True quando viene aperto il Db

Firebird 2.5 Superserv (in locale)
Componenti TSQLConnection e TSQLTransaction su Datamodule separato
Componente TSQLQuery su Datamodule
la query e' una INSERT INTO
Codice: [Seleziona]
  Result := True;
  SQL_Operatori.SQL.Text := sQuery;
  try
    SQL_Operatori.ExecSQL;   //viene eseguita
    frm_ConnessioneFB.EsegueTransazione; //solleva eccezione
  except
    Result := False;
  end; 
questa la procedure
Codice: [Seleziona]
procedure Tfrm_ConnessioneFB.EsegueTransazione;
begin
  SQLTransaction1.Commit;
  //SQLTransaction1.CommitRetaining;  //stessa eccezione
end;
Titolo: Re:Transaction SqlDb + Firebird
Inserito da: xinyiman - Marzo 13, 2013, 07:48:25 pm
Posta anche la query
Titolo: Re:Transaction SqlDb + Firebird
Inserito da: Stefano - Marzo 13, 2013, 09:23:48 pm
Ecco la Query
Codice: [Seleziona]
  sQuery := 'INSERT INTO TB_OPERATORI ( ' +
  'ID_OPERATORE, ' +
  'ID_INCARICO,' +
  'COGNOME,' +
  'NOME,' +
  'TESSERINO_NR,' +
  'ID_AREA,' +
  'DIRITTI_ACCESSO,' +
  'USERNAME,' +
  'PASSWORD,' +
  'NEWPASSWORD,' +
  'DATAPWD,' +
  'DURATA,' +
  'DATAASSUNZIONE,' +
  'ID_QUALIFICA,' +
  'DATAQUALIFICA,' +
  'EMAIL' + ')' +

  'VALUES(' +
  ':IdOp, ' +
  ':IdInc, ' +
  ':Cognome, ' +
  ':Nome, ' +
  ':Tessera, ' +
  ':IdArea, ' +
  ':Diritti, ' +
  ':User, ' +
  ':Passw, ' +
  ':NewPassw, ' +
  ':DataPwd, ' +
  ':Durata, ' +
  ':DataAss, ' +
  ':IdQual, ' +
  ':DataQlf, ' +
  ':Email) ';

  Sql_Operatori.Close;
  Sql_Operatori.SQL.Clear;
  Sql_Operatori.SQL.Add(sQuery);
  Sql_Operatori.Params.ParamByName('IdOp').AsInteger := 9;
  Sql_Operatori.Params.ParamByName('IdInc').AsInteger := 1;
  Sql_Operatori.Params.ParamByName('Cognome').AsString := 'aaa';
  Sql_Operatori.Params.ParamByName('Nome').AsString := 'bbbb';
  Sql_Operatori.Params.ParamByName('Tessera').AsString := 'acccc';
  Sql_Operatori.Params.ParamByName('IdArea').AsInteger := 1;
  Sql_Operatori.Params.ParamByName('Diritti').AsString := 'xxx';
  Sql_Operatori.Params.ParamByName('User').AsString := 'usexxx';
  Sql_Operatori.Params.ParamByName('Passw').AsString := 'pwdxxx';
  Sql_Operatori.Params.ParamByName('NewPassw').AsString := 'newpwdxxx';
  Sql_Operatori.Params.ParamByName('DataPwd').AsDate := StrToDate('11/03/2013');
  Sql_Operatori.Params.ParamByName('Durata').AsInteger := 10;
  Sql_Operatori.Params.ParamByName('DataAss').AsDate := StrToDate('12/03/2013');
  Sql_Operatori.Params.ParamByName('IdQual').AsDate := StrToDate('11/03/2013');
  Sql_Operatori.Params.ParamByName('DataQlf').AsDate := StrToDate('12/03/2013');
  Sql_Operatori.Params.ParamByName('Email').AsString := 'pippo@pippo.it';

  Result := True;
  SQL_Operatori.SQL.Text := sQuery;
  try
    SQL_Operatori.ExecSQL;
    frm_ConnessioneFB.EsegueTransazione;
  except
    Result := False;
  end;
Titolo: Re:Transaction SqlDb + Firebird
Inserito da: nomorelogic - Marzo 14, 2013, 09:26:41 am
dopo che hai assegnato la query ed impostato i parametri, ho visto che fai:
Codice: [Seleziona]
 SQL_Operatori.SQL.Text := sQuery;
questa assegnazione di sicuro ti annulla tutti i parametri messi precedentemente

togli questa riga e riprova, è molto probabile che il problema sia tutto qua
Titolo: Re:Transaction SqlDb + Firebird
Inserito da: Stefano - Marzo 14, 2013, 12:44:16 pm
Ho tolto l'assegnazione SQL_Operatori.SQL.Text  := sQuery;
ma non risolve, al momento del Commit solleva eccezione.

Sto eseguendo il test su CodeTyphon4.10, ma credo che sia ininfluente,
TSQLQuery, TSQLTransaction e IBConnection sono componenti standard

altra cosa nonostante il Try Except
il debugger resta sulla linea del Commit

e ancora verificando se la Transazione e' attiva solleva la stessa eccezione
Codice: [Seleziona]
procedure Tfrm_ConnessioneFB.EsegueTransazione;
var sErrore: string;
begin
 //la verifica solleva eccezione
 if not SQLTransaction1.Active then SQLTransaction1.Active := true;
 try
  SQLTransaction1.Commit;
 except
  on E : Exception do
    sErrore := E.ClassName + ' error raised, with message : ' + E.Message;
  //SQLTransaction1.CommitRetaining;
 end;
end;
Titolo: Re:Transaction SqlDb + Firebird
Inserito da: Stilgar - Marzo 14, 2013, 01:15:52 pm
Possibile che ci sia già quel record nel db e scatti una violazione di chiave primaria nel database, trappata male dal connettore?
Stilgar
Titolo: Re:Transaction SqlDb + Firebird
Inserito da: Stefano - Marzo 14, 2013, 03:26:10 pm
Quel record non e' presente , comunque per la certezza chiamo una StoredProcedure

Il Db ha un Domain che impone ID_OPERATORE Not Null
La Table TB_OPERATORI ha solo una Primary Key su ID_OPERATORE e nessuna dipendenza

la StoredProcedure CON_OPERATORI_ID
Codice: [Seleziona]
begin
  ID_OPERATORE = gen_id(gen_id_operatore, 1);
  suspend;
end

ho modificato la Query per assegnare l'ID
Codice: [Seleziona]
  Sql_Operatori.Params.ParamByName('IdOp').AsInteger := GetID;

Codice: [Seleziona]
function Tfrm_Dati_Operatori.GetID: integer;
begin
  if Sql_Operatori.Active then Sql_Operatori.Active := False;
  Sql_Operatori.SQL.Text := 'SELECT ID_OPERATORE FROM CON_OPERATORI_ID';
  Sql_Operatori.Active := True;
  Result := Sql_Operatori.FieldByName('ID_OPERATORE').AsInteger;
end;
La StoredProcedure fa il suo lavoro, dopo l'esecuzione, il Generatore risulta incrementato

Operazione analoga (stessa Tabella) da Delphi non crea problemi
Titolo: Re:[RISOLTO]Transaction SqlDb + Firebird
Inserito da: Stefano - Marzo 14, 2013, 03:56:43 pm
Ho creato un progetto vuoto con un Datamodule ed inseriti i componenti
Eseguita le stessa operazione, non crea alcun problema.

L'intoppo potrebbe essere nel Datamodule (era stato creato con la Rel .270)
e per qualche motivo risulta corrotto o incompatibile.

Chiaramente non e' pensabile rifare i Datamodule al variare della versione,
devo capire dov'e' il problema.

Altro comportamento dubbio, se ad ogni modifica non faccio il Build, non "vede" le righe modificate.