Einzelnen Beitrag anzeigen

mannewolff

Registriert seit: 21. Okt 2008
48 Beiträge
 
RAD-Studio 2009 Arc
 
#7

Re: DB param explizit auf 0 setzen

  Alt 16. Mai 2010, 14:48
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.,
  Mit Zitat antworten Zitat