AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird, TIBDataset Löschanweisungen unsichtbar
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird, TIBDataset Löschanweisungen unsichtbar

Ein Thema von alzaimar · begonnen am 5. Jan 2009 · letzter Beitrag vom 7. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 5. Jan 2009, 21:14
Datenbank: Firebird • Version: 2.x • Zugriff über: TIB-Komponenten
Hiho,

Ich erzeuge eine TIBDatabase, eine TIBTransaction und ein TIBDataset. Im TIBDataset steht sowas wie 'select * from Daten'.

Ich öffne das TIBDataset, lese alle Zeilen ein, merke mir die IDs, schließe das TIBDataset und dann baue ich mir aus den gemerkten IDs ein Delete-Statement zusammen:
Delphi-Quellcode:
const
  szDelete = 'Delete from %s where ID in (%s)';
var
  sData: string;
  sDeleteList: string;

begin
  fQuery.Dataset.Active := True; // fQuery ist ein privates Feld einer 'TFoobarQuery', die widerum das TIBDataset kapselt
  sDeleteList := '';
  try
    fQuery.Dataset.First;
    while not fQuery.Dataset.Eof do begin
      sDeleteList := sDeleteList + VarToStr (fQuery.Dataset['ID']) + ',';
      fQuery.Dataset.Next;
    end;
  finally
    fQuery.Dataset.Active := False;
    if sDeleteList <> 'then begin
      SetLength(sDeleteList, Length(sDeleteList) - 1);
      fConnection.Execute(Format(szDelete, [fTableName, sDeleteList])); // fConnection ist eine TFoobarConnection, die
    end; // eine TIBDatabase kapselt.
  end;
end;
...
procedure TConnection.Execute(const sSQL: string);
var
  cmd: TIBScript;

begin
  cmd := TIBScript.Create(nil);
  try
    fTransaction.StartTransaction;
    try
      cmd.Database := fDatabase;
      cmd.Script.Text := sSQL;
      cmd.ExecuteScript;
      fTransaction.Commit;
    except
      fTransaction.Rollback;
      raise;
    end;
  finally
    cmd.Free;
  end;
end;
Beim 1. Aufruf werden alle Zeilen eingelesen, das Delete-Statement gebastelt und alle Zeilen gelöscht. Toll.
Nun füge ich eine Zeile ein und rufe die o.g. Routine nochmal auf. Was soll ich sagen, das Dataset enthält die selben Daten, wie eben, obwohl die gelöscht sind (per IBExpert nachgeschaut).

Wie muss ich das anstellen, das so etwas Einfaches funktioniert, also das beim 2.Lesen mal zur Abwechslung andere Daten im Dateset stehen?

Danke und Grüße
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 5. Jan 2009, 21:25
Kann das ein Problem mit den Transaktionen sein? Dein Dataset nutzt wohl eine andere Transaktion wie das Lösch-Statement. Wenn die Transaktion der Dataset nicht beendet wurde und der Isolation-Level auf RepeatableRead steht, dann sollten wohl immer die gleichen gleichen Daten gelesen werden. Hilt es hier, auf ReadCommited zu gehen bzw. die auch das Lesen in expliziten Transaktionen zu starten?
(Kann's momentan nicht testen, drum nur Vermutungen)

Grüße,
Uli
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 00:27
Es sieht wohl eher so aus, als ob die Daten noch im Cache gehalten werden.

Mit ReQuery müsste man eigentlich eine neue Abfrage erzwingen können.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 06:17
ULIK: Dataset und Skript verwenden die gleiche Transaktion. Den Isolation Level kann ich nicht einstellen.
Sir Rufo: Wie führt man mit einem TIBDataset ein 'ReQuery' aus?

Bei IBExpert muss ich selbst SELECT-Anweisungen ('Data'-Tab in der Tabellenansicht) committen, um Änderungen sichtbar zu machen. Kann es sein, das das hier fehlt? Wieso muss man eigentlich SELECT-Anweisungen committen?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 08:24
Zitat von alzaimar:
ULIK: Dataset und Skript verwenden die gleiche Transaktion. Den Isolation Level kann ich nicht einstellen.
Sir Rufo: Wie führt man mit einem TIBDataset ein 'ReQuery' aus?

Bei IBExpert muss ich selbst SELECT-Anweisungen ('Data'-Tab in der Tabellenansicht) committen, um Änderungen sichtbar zu machen. Kann es sein, das das hier fehlt? Wieso muss man eigentlich SELECT-Anweisungen committen?
Offensichtlich verwendet das Script nicht die selbe Transaktion, wie man deinem Quelltext entnehmen kann.
Der Skriptkomponente wird keine Transaktion zugewiesen, damit erzeugt diese sich temporär eine eigene.

Auch das Lesen der Daten startet eine Datenbanktransaktion. So lange diese nicht abgeschlossen ist, wirst du innerhalb dieser Transaktion immer die Daten erhalten, die zum Zeitpunkt des Transaktionsstarts gültig waren oder innerhalb der Transaktion verändert wurden. Solange nur Daten gelesen werden, ist es egal ob mit Commit oder Rollback beendet wird.

Natürlich alles abhängig von der Art der Isolation...
http://de.wikipedia.org/wiki/Isolation_(Datenbank)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 09:40
Hi Blup,

Danke für die Info: Ich kann das jetzt nicht testen (bin auf Arbeit), aber das könnte es wirklich sein (Skript/Transaktion).

Muss ich ein eigentlich ein 'SELECT' explizit mit einem 'StartTransaction/Commit' umschließen? Ich möchte solche Aktionen (SELECT, DELETE usw.) gerne vollständig kapseln und reentrant gestaltent, das also z.B. der Aufruf einer 'Select'-Methode nicht zu einem 'Transaktion ist noch offen' führt, was hier auch passiert ist.

Entschuldigt meine Unkenntnis, aber mit Firebird/TIBxxxx-Komponenten hab ich bisher nicht gearbeitet, sondern immer nur mit ADO, wo Transaktionen explizit angestoßen werden.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 12:43
@Alzaimar : in Deinem Alter sollte man sich mal so langsam mit Multi-Generationen-Architektur beschäftigen. Damit man nicht wirklich jedes select umständlich mit StartTransaction-Commit/Rollback umschließen muss, gibts ja die Transaction-Isolation-Levels. Z.B. read_commited
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 13:13
Transaktionsisolation hat imho recht wenig mit MGA zu tun.
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 19:08
Hurra! Ich habe es geschafft! Ein Programm, das funktioniert!

Isolation Level eingestellt, dem Skript die gleiche Transaktion verpasst und

Etwas schade allerdings, das eine so wichtige Eigenschaft wie 'Isolation Level' in der undokumentierten Params-Eigenschaft versteckt ist. Na ja, IB ist eben nur etwas für wahre Männer.

Danke für die sachliche Hilfe und das Verkneifen fieser Kommentare. Mein besonderer Dank gilt dem einzig wahren FB/IB Guru: "Uns" Hansa .
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Firebird, TIBDataset Löschanweisungen unsichtbar

  Alt 6. Jan 2009, 19:19
Zitat von alzaimar:
Hurra! Ich habe es geschafft! Ein Programm, das funktioniert!

Isolation Level eingestellt, dem Skript die gleiche Transaktion verpasst und

Etwas schade allerdings, das eine so wichtige Eigenschaft wie 'Isolation Level' in der undokumentierten Params-Eigenschaft versteckt ist. Na ja, IB ist eben nur etwas für wahre Männer.
Autotest Opel Corsa: hakelige Schaltung, schwere Kupplung => Fazit: scheiß Karre
Autotest Ferrari: hakelige Schaltung, schwere Kupplung => Fazit: geilste Karre von Welt

Zitat von alzaimar:
Danke für die sachliche Hilfe und das Verkneifen fieser Kommentare. Mein besonderer Dank gilt dem einzig wahren FB/IB Guru: "Uns" Hansa .
"fiese Kommentare" ... wir ... NIEMALS ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz