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."