Hallöle...
Zitat:
Wie z.B. das
SQL Gefrickel im Code zu vermeiden
Dazu braucht es nicht umbedingt ein ORM. Ich verwende eine andere Strategie. Es gibt für jedes
DBMS was benutzt wird, ein Interface. Der komplette Zugang zur
DB ist in diesem Interface gekapselt. Im Interface werden dann die Ergebnisse der
SQL Abfragen in Objekte gewandelt. Die Anwendung kennt eigentlich keine Datenbank. Die Daten könnten auch aus Oma´s Küchenschrank kommen. Dann sage ich nur in der Anwendung (Aufruf procedure im Interface)... "Fülle mir mal die Liste mit den Mitarbeitern". Am Ende habe ich eine TObjectList<TMitarbeiter>...fertsch. Nachteil: Man verzichtet hoffentlich auf datensensitive Controls...denn da funktioniert das nicht.
Zum SQL Gefrickel:
[Meine Lösung]
Meine Statements liegen in einer Ordnerstruktur. Das bedeutet, die Statements sind
ausführbar im Editor. Diese Struktur wird als Ressource einkompiliert. Das Interface holt sich die
SQL aus der Ressource
entsprechend des
DBMS. In den Proceduren gibt es nur den Namensaufruf und die Zuordnung der Parameter...fertsch
Delphi-Quellcode:
function TBlubbDatabase.GetSQLByName(SQLName: string): string;
var
SQLStream: TResourceStream;
SQLStrings: TStringList;
SQLStringsDecrypt: TStringList;
begin
Result := '';
SQLStrings := TStringList.Create;
try
SQLStringsDecrypt := TStringList.Create;
try
SQLStream := TResourceStream.Create(HInstance, SQLName, PWideChar(conDatabaseResourceGroupString));
try
try
SQLStrings.LoadFromStream(SQLStream);
SQLStringsDecrypt.Text := TBlubbToolsCrypt.Decrypt(SQLStrings.Text, conKey); //Verschlüsselung wenn nötig
SQLStringsDecrypt.Delete(0); // Kommentar entfernen
Result := SQLStringsDecrypt.Text;
except
Result := '';
end;
finally
SQLStream.Free;
end;
finally
SQLStringsDecrypt.Free;
end;
finally
SQLStrings.Free;
end;
end;
Delphi-Quellcode:
procedure TBlubbDatabase.FillList(List: TBlubbFieldList; TableName: string);
var
I: Integer;
Qry: TFDQuery;
Field: TBlubbField;
begin
Qry := CreateQuery;
try
Qry.SQL.Text := Format(GetSQLByName('BLUBB_TABLE_FIELDLIST'), [TableName]);
Qry.Open;
if not Qry.Eof then
begin
List.Clear;
for I := 0 to Qry.Fields.Count - 1 do
begin
Field := TBlubbField.Create;
Field.FieldIndex := I;
Field.FieldName := Qry.Fields[I].FieldName;
Field.Fieldype := Qry.Fields[I].DataType;
List.Add(Field);
end;
end;
finally
Qry.Free;
end;
end;