Einzelnen Beitrag anzeigen

RSE

Registriert seit: 26. Mär 2010
254 Beiträge
 
Delphi XE Enterprise
 
#1

TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query

  Alt 15. Feb 2013, 13:02
Datenbank: IB • Version: 6.x • Zugriff über: IBObjects
Hallo,

wir haben Aktionen, die sich zu großen Teilen gleichen. Dazu gibt es einen Programmteil, der für jede Aktion angepasst wird. Der Programmteil arbeitet mit einer Menge DB-Tabellen, die zum Teil aktionsübergreifend und zum Teil aktionsspezifisch sind. Die Datenbankfelder sind zur Designtime in die Queries importiert, um leichter darauf zugreifen zu können. Nun kommt es allerdings vor, dass einzelne Felder sich ändern, z.B. hat das Feld PRODUKT in der einen Aktion die Länge 80 und in einer anderen die Länge 255 (TField.Size).

Es ist zu aufwendig bei jeder neuen Aktion von Hand alle Felder in den Queries mit den Längen der DB-Felder zu vergleichen. Hat aber z.B. das Feld in der Query die Länge 80 und das DB-Feld die Länge 255, so können Strings > 255 Zeichen eingelesen werden, es entstehen aber am Ende ein paar Zeichen Datenmüll. Das will ich verhindern, da zu vermuten ist, dass vielleicht unentdeckte Zugriffsverletzungen im Hintergrund stattfinden.

Ich habe gefunden, dass man Size wie folgt anpassen kann:
Delphi-Quellcode:
for A := 0 to Dataset.FieldCount-1 do
begin
  AField := Dataset.Fields[A];
  if AField is TStringField then
    TStringField(AField).Size := Dataset.FieldDefs.Find(AField.FieldName).Size;
end;
  • AField.Size hat zur Laufzeit (auch nach dem Öffnen der Query) immernoch den zur Designtime zugewiesenen (u.U. falschen) Wert.
  • Dataset.FieldDefs.Find(AField.FieldName).Size enthält hingegen die wahre Länge aus der DB, allerdings erst nach dem Öffnen der Query
  • AField.Size lässt sich aber (scheinbar) nur ändern, wenn die Query geschlossen ist. Meldung: "Operation bei geöffneter Datenmenge nicht ausführbar"
Ich möchte nicht die Queries mehrmals öffnen, da das zu lange dauert und vielleicht auch programmtechnische Nebenwirkungen hat, die ich vermeiden möchte.
Wir verwenden Delphi 5 und die IBObjects (Payware, nicht aktuell, kein Herstellersupport mehr), daran kann auch kurzfristig nichts geändert werden.

Wer kennt sich evtl. besser mit speziell diesen Komponenten oder allgemein mit DB-Queries so gut aus, dass er mir zu diesem Problem einen Lösungsansatz anbieten kann?

Ich habe bereits alle Ereignisse der TIBOQuery getestet (incl. OnCallback - falls ich das richtig verstanden habe): Entweder ist FieldDefs noch leer oder die Query ist bereits "geöffnet" und es kommt die oben genannte Fehlermeldung. Vielleicht lässt sich mit einem Interceptor etwas machen, aber ich habe den Quelltext von TIBOQuery nicht.
"Seit er seinen neuen Computer hat, löst er alle seine Probleme, die er vorher nicht hatte."
  Mit Zitat antworten Zitat