Avatar billede f2f4 Novice
08. september 2004 - 10:52 Der er 12 kommentarer og
1 løsning

Database opdatering med TIBSQL

Mit program fryser fast når IBSQL.ExecQuery i nedenstående kode udføres (fryser = jeg må lukke hele Delphi 7 for at komme videre) - er der nogle der har et hint - tak!
(Desinetime kan jeg se at forbindelsen til databasen er helt ok!)

  with DMLicens do
  begin
    IBSQL.Transaction:= DMLicens.IBTransaction;
    IBSQL.Close;
    IBSQL.SQL.Clear;
    IBSQL.SQL.Add('insert into KUNDE');
    IBSQL.SQL.Add(' (KUNDENR)');
    IBSQL.SQL.Add(' values(');
    IBSQL.SQL.Add(':VALKundeNr)');
    if not IBDatabase.InternalTransaction.InTransaction then
      IBDatabase.InternalTransaction.StartTransaction;
    IBSQL.Prepare;
    IBSQL.ParamByName('VALKundeNr').AsInteger    := KundeNr;
    try
      IBSQL.ExecQuery;
      IBDatabase.InternalTransaction.Commit;
    except
      IBDatabase.InternalTransaction.Rollback;
    end;
  end;
Avatar billede hrc Mester
08. september 2004 - 11:05 #1
Kan ikke umiddelbart pege på noget, men jeg tror mine ændringer måske kan have virkning. Min HandleLocally er til for at kunne styre alle tre kommandoer. Det kan dog godt være være at jeg misforstår Intrabases InternalTransaction.InTransaction (noget kunne tyde på det - er der flere niveauer af transaktioner i Intrabase?):

Måske er fejlen at du ikke reraiser exceptionen hvis der fejles.

var
  HandleLocally : boolean;
begin
  with DMLicens do
  begin
    HandleLocally := not IBDatabase.InternalTransaction.InTransaction;
 
    // Denne her forstår jeg ikke helt betydningen
    IBSQL.Transaction:= DMLicens.IBTransaction;

    IBSQL.SQL.Text := 'Insert into KUNDE (KUNDENR) values(:VALKundeNr)';

    if HandleLocally then
      IBDatabase.InternalTransaction.StartTransaction;

    IBSQL.Prepare;
    IBSQL.ParamByName('VALKundeNr').AsInteger := KundeNr;
    try
      IBSQL.ExecQuery;
      if HandleLocally then
        IBDatabase.InternalTransaction.Commit;
    except
      if HandleLocally then
        IBDatabase.InternalTransaction.Rollback
      else
        raise;
    end;
  end;
end;
Avatar billede f2f4 Novice
08. september 2004 - 11:24 #2
Tak men ingen forskeld
.. mit program står til 'Not Responding' efter linien IBSQL.ExecQuery er kørt! )-:
Avatar billede f2f4 Novice
08. september 2004 - 11:37 #3
OBS: Jeg opdagede at det virker hvis en TIBTable.Active først sættes til false og VALKundeNR dropper og værdien sættes direkte i SQL'en!!
Siger det mon nogle noget?
Avatar billede pellelil Nybegynder
08. september 2004 - 11:58 #4
FY DA FØJ !!! TxxxTable er banlyst i en rigtig database. Jeg har set beskrivelser der siger at en TIBTable har 30% mere overhead end en TIBQuery.

Den enste der stikker mig i øjnene er at du bruger din IBDatabase's transaktion (jeg siger ikke at det er forkert, men jeg har aldrig brugt den). Derimod bruger jeg en anden transaktion som jeg opretter til formålet, og det har aldrig givet anledning til problemer.
Avatar billede hrc Mester
08. september 2004 - 12:03 #5
Ærgerligt at det ikke duede.

Close og active = false er det samme.

At du skipper brugen af paramete er en dårlig ting. Eksempelvis skal du pludselig til at håndtere apostrofferne i 'Dette er en ''Stor'' test' eller decimalseparatorerne i decimaltal.

At det så virker er en anden sag.

Prøv at gå tilbage til parameterløsningen og test denne rettelse:

with IBSQL.ParamByName('VALKundeNr') do
begin
  DataType := ftInteger;
  Value := KundeNr; // hvis det ikke virker, så prøv AsInteger
end;

Kan det tænkes at du får en exception som ikke håndteres (en EAbort eller lignende)?
Avatar billede f2f4 Novice
08. september 2004 - 12:21 #6
>hrc
- Ingen forskeld (Datatype:= ftInteger kompilere ikke men Value.AsInteger gør)
- har prøvet at lave en try-except udenom selve procedurekaldet, den fanges heller igge, så ... hvordan kan jeg tjekke om en exception ikke håndteres!?
Avatar billede pellelil Nybegynder
08. september 2004 - 14:36 #7
hrc> Ligeledes har parametrene også den fordel at din SQL ikke skal prepares mere end en gang.
Avatar billede f2f4 Novice
08. september 2004 - 15:10 #8
Nedenstående giver samme fejl !!! )-:

    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add('Insert into KUNDE (KUNDENR) values(:KundeNr)');
    IBQuery1.ParamByName('KundeNr').AsInteger := 123;

    try
      IBQuery1.ExecSQL;
      if HandleLocally then
        IBDatabase.InternalTransaction.Commit;
    except
      on e: Exception do
      begin
        if IBQuery1.State in [dsEdit, dsInsert] then
          IBQuery1.Cancel;
        IBDatabase.InternalTransaction.Rollback;
        ShowMessage('Error in insert: ' + E.Message);
      end;
    end;
Avatar billede f2f4 Novice
08. september 2004 - 15:14 #9
>pellelil
Hvad mener du lige med 'en anden transaktion som jeg opretter til formålet'. IBTransaction er vel central mellem IBDatabase og IBQuery eller?
Avatar billede hrc Mester
08. september 2004 - 16:24 #10
pellelil: Er sikker på at f2f4 lavede en stavefejl da han skrev TIBTable - jeg overså det.

Jeg læste lidt i hjælpeteksten og der står at internaltransaction er brugt ..  ja, internt. Den skal man altså ikke bruge.

Jeg antager, at kobler man en transaktion på en database, så er den default koblet på alle de TIBQuery'er som er tilkoblet databasen (også selvom der er en property på queryen) - eller er det forkert?
Avatar billede pellelil Nybegynder
08. september 2004 - 18:46 #11
Det er korrekt at din IBDatabase skal være knyttet til en Transaktion, men det skal ikke afholde dig fra at bruge flere transaktioner. Jeg har aldrig selv brugt den transaktion der er knyttet til selve database, så jeg kan ikke sige hvad der sker, men umiddelbart ser hrc også ud til at mene at man skal undgå den.

Jeg har somregel altid sat (mindst) en TIBTransaktion ind på hver form i mine programmer (hvis du eks. har en form til vedligeholdelse af kunder, en anden til varer osv). Dette sikre at på hver form kan lave en Commit/Rollback uden at dette på nogen måde får indflydelse på de IBX componenter du anvender på andre forms.

Din IBDatabase skal således ikke "pege på" disse transaktioner, men de (andre) komponenter IBX componenter du sætter ind på formen skal anvende formens egen transaktion
Avatar billede f2f4 Novice
22. september 2004 - 12:41 #12
Lidt status:
Jeg beklager manglende status vedr. dette spørgsmål, men jeg har desværre været optaget af andre opgaver samt haft en uges ferie.
I øvrigt har jeg vist desværre glemt at fortælle at jeg bruger databasen Firebird!

Jeg er utrolig taknemmelig for jeres hjælp, - men er i tvivl om hvem der fortjener pointene, problemet blev for så vidt ikke løst tros hrc’s fine forsøg, men måske har jeg kludret i det. Samtidig har pellelil’s sidste kommentar og dokumentet ’ http://www.liljendal.dk/files/IB for begyndere_Extern.zip’ fra (http://www.eksperten.dk/spm/535248) hjulpet mig meget! Så ... jeg er i tvivl!?

Hvorom alting er har jeg nu fået det til at virke ... se evt. nyt spørgsmål (http://www.eksperten.dk/spm/542441) hvor min løsning fremgår!?
Avatar billede pellelil Nybegynder
23. september 2004 - 08:22 #13
Hermed et "svar" hvis du synes at nogle point skal kastest i denne retning
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