So würde ich es auch machen, funktioniert aber nicht. Zur Laufzeit gibt es eben genau die Fehlermeldung, dass der Parameter nicht gesetzt wurde. Mein
SQL-String sieht wie folgt aus:
Delphi-Quellcode:
procedure TPersistenz.createInsertQuery();
var
stringList : TStringList;
i : Integer;
sql :
String;
begin
stringList := getMETA(true);
sql := '
INSERT into ' + getTableName() + '
(';
// Alle Attribute der Fachklasse
for i := 0
to stringList.Count -1
do
begin
sql :=
sql + stringList.Strings[i] + '
, ';
end;
// Zusätzlich die Defaultattribute
sql :=
sql + '
id, active, createuser, createdate, modifyuser, modifydate, uniqueString, version) ';
sql :=
sql + '
VALUES (';
// Alle Parameterwerte der Fachklasse
for i := 0
to stringList.Count -1
do
begin
sql :=
sql + '
:' + stringList.Strings[i] + '
, ';
end;
// Zusätzlich die Defaultparameter
sql :=
sql + '
:id, :active, :createuser, :createdate, :modifyuser, :modifydate, :uniqueString, :version)';
query.SQL.Add(
sql);
end;
Der Code ist in der Superklasse TPersistenz und gilt für alle Objekte, die persistiert werden können. getMeta() wird dann von den Fachklassen überschrieben und liefert die Liste der Attribute. Die Fachklassen selbst werden generiert, das heißt getMeta() liefert immer (!) alle Attribute der Klasse.
Ich habe jetzt den Generator angepasst, dass getMeta() unter bestimmten Umständen die Null-ForeignKeys nicht liefert. Ich zeichne diese ForeignKeys mit NFK_ aus (im Gegensatz zu FK_ Keys die nicht null sein dürfen) und mein Generatortemplate sieht dann so aus:
Delphi-Quellcode:
(*********************************************************************
Gibt die META-Daten für diese Klasse zurück.
*********************************************************************)
function @OBJNAME.getMETA(modifyList : boolean = false) : TStringList;
begin
...
@foreach @Attribute @do
@if(copy @Attribute.Identifier 1 3 == NFK)
if (@Attribute.Identifier <> 0) then
@endif
stringList.Add('@Attribute.Identifier');
@EndForEach
..
end;
Es wird also in den Fall modifyList ein Attribut nur der Stringlist hinzugefügt wenn es nicht mit NFK anfängt oder wenn es eub NFK Attribut ist und es nicht 0 ist.,