Avatar billede f2f4 Novice
22. september 2004 - 12:40 Der er 6 kommentarer og
1 løsning

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;
Avatar billede martinlind Nybegynder
22. september 2004 - 12:51 #1
Jeg plejer at lægge DB functioner på mit datamodule.

Din grid skulle blive opdateret ved at du lukker og åbner det dataset den bruger det er ikke nødvendigt at lukke din database. et tdataset har en refresh, men den virker kun under ganske særlige forhold som sjælendet er tilstede. Du skal forøvrigt ikke bruge en TIDTable hvis du kan undgå det, brug en Query i stedet, den er bedre og laver ikke så meget overhead som en table comp.
Avatar billede martinlind Nybegynder
22. september 2004 - 12:52 #2
en query kan ikke altid køre med "live" data, men den er meget bedre end en table, også selv om du skal lave din update manuelt
Avatar billede f2f4 Novice
22. september 2004 - 15:20 #3
>martinlind: 'Din grid skulle blive opdateret ved at du lukker og åbner det dataset den bruger det er ikke nødvendigt at lukke din database' - det gør den ikke, måske jeg mangler noget i min GemKunde!?
Kaldet ser nu således ud:
    try
      DMLicens.GemKunde(exKundenr.AsInteger,
              exNavn.AsString,
              exAdresse.AsString,
              StrToInt(PostList.Text),
              exTlf.AsInteger,
              exEmail.AsString,
              cbStatus.ItemIndex);
    except
//    DBGrid1.Refresh;
    end;
    IBDataSet.Active:= false;
    IBDataSet.Active:= true;

TIDTable ... jeg går ud fra TIBTable ... dem bruger jeg heller ikke
Avatar billede martinlind Nybegynder
22. september 2004 - 15:28 #4
jeg kender ikke IBDataSet, men den er sikker ok, du kan evt. sige dbgrid1.datasource.dataset := false;
dbgrid1.datasource.dataset := true;

det SKAL virke, eller tyder det på du har nogle uafsluttede transactions.
Avatar billede f2f4 Novice
22. september 2004 - 16:21 #5
Så tyder det på en uafsluttet transaction |-: ... jeg leder men ...
(jeg har ikke andre transactions end ovenstående i 'OpretKunde', samt en dommy en på DataModule´t)
Avatar billede f2f4 Novice
22. september 2004 - 16:31 #6
>martinlind
Undskyld der var jeg ski for hurtig ... det virker ... DBGrid.DataSource.DataSet's transaction stod til DMLicens.DommyIBTransaction fremfor formens enig IBTransaction!

Jeg tror du har fortjent pointene, men jeg tillader mig lige at vente til i morgen for at se om der skulle være andre kommentarer! Håber det er Ok.
Avatar billede f2f4 Novice
22. september 2004 - 16:32 #7
enig = egen (-;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester