Firebird igen igen!
Jeg nu har flere spørgsmål om emnet herinde (senest: http://www.eksperten.dk/spm/537454)! Nu har jeg haft tid til at kigge på det igen .. og det virker! (-;Men men er der nogle der vil fortælle mig om jeg gør det rigtigt!? Lidt info, kode og kommentarer herunder:
..........................................
1)
Jeg har et DataModule (TDMLicens) hvorpå det ’kun’ er en IBDatabase samt en DommyIBTransaction (som i øvrigt ikke bruges til noget)! I Create/Destroy til Modulet Connecter/Disconnecter jeg til Firebird databasen.
2)
Jeg har en form unit med en IBTransaction, IBDataSet, DataSource samt en DBGrid. Diverse properties er sat bl.a. ’active:= true’.
3)
Jeg har en unit tænkt som at her skal alt kommunikation med databasen ligge, bl.a. nedenstående ’indsættelses funktion’ – i koder er angivert nogle kommentarer og spørgsmål. Punkt 2’s form unit kalder ned i denne funktion, hvorefter IBDataSet.Active sættes til true.
Tak hvis nogle kan/vil give mig et prej ... 1: om opbygningen er ok?, 2. svare på mine spørgsmål i nedenstående kode.
/Morten
Kode:
function GemKunde(KundeNr: integer;
Navn: String;
Adr: String;
Postnr: integer;
Tlf: integer;
Email: String;
Status: integer): boolean;
var
ok: boolean;
IBTransaction: TIBTransaction;
IBQuery: TIBQuery;
begin
ok:= true;
//klargør databasen (skal flyttes ud i en generel procedure!)
IBTransaction:= TIBTransaction.Create(nil);
IBTransaction.DefaultDatabase:= DMLicens.IBDatabase;
IBTransaction.Active:= true;
IBQuery:= TIBQuery.Create(nil);
//Opdatere databasen
(*Jeg har ladet mig forstå at IBDataSet er bedre at bruge en IBQuery (da
IBQuery i nogle tilfælde kræver en IBUpdateSQL). Men jeg har ikke forstået
dette, er nedenstående ikke som det skal være!?*)
IBQuery.Database:= DMLicens.IBDatabase;
IBQuery.Transaction:= IBTransaction;
IBQuery.Close;
IBQuery.SQL.Clear;
IBQuery.SQL.Add('Insert into KUNDE (KUNDENR) VALUES (:KNR)');
IBQuery.ParamByName('KNR').AsInteger:= KundeNr;
if not IBTransaction.InTransaction then
IBTransaction.StartTransaction;
try
//IBDataSet.Active:= true;
IBQuery.ExecSQL;
except
on e: Exception do
begin
if IBQuery.State in [dsEdit, dsInsert] then
IBQuery.Cancel;
IBTransaction.Rollback;
ShowMessage('Error in insert: ' + E.Message);
ok:= false;
end;
end;
IBTransaction.Commit;
//Hvorfor er nedenstående nødvendigt!? Hvis ikke opdateres min DB grid i form unit´en ikke!
DMLicens.IBDatabase.Close;
DMLicens.IBDatabase.Open;
result:= ok;
end;
