Moin...
Zitat:
Meine Frage ist eher, wo ich diese Logik nun implementiere. In der ObjectList oder in den einzelnen Objekten - Quasi die best practise.
Imho im Objekt ganz falsch...
Das Objekt hat die Datenbank nicht zu kennen!
Ich setze noch einen drauf.
Die Datenbanklogik steckt in einem Interface. Die Anwendung kennt nur das Interface. Das hat den Vorteil, daß man Mal eben die Datenbank austauschen kann.
Delphi-Quellcode:
IdVA_Database = interface(IdDatabaseUser)
['{C1BC6FE3-9586-4D92-8221-A3DD030E80B5}']
procedure AddToLogServer(DeviceID: Integer; Time: TDateTime; Text: string; MessageState: TdMessageState);
procedure AddToLogClient(UserID: Integer; Time: TDateTime; Text: string; MessageState: TdMessageState);
property LogCount: Integer read GetLogCount write SetLogCount;
function Save(aMasterDevice: TMasterDevice): Integer; overload;
...
TDatabaseIB = class(TInterfacedObject, IdVA_Database)
Speichern am Beispiel eines Objektes (TMasterDevice):
Delphi-Quellcode:
TdDataState = (ddsCreated, ddsNormal, ddsNew, ddsEdit, ddsModified, ddsDeleted, ddsNewModified, ddsLocked, ddsUnlocked, ddsUnknown);
function TDatabaseIB.CreateQuery: TUniQuery;
begin
Result := TUniQuery.Create(nil);
Result.Connection := FConnection;
end;
function TDatabaseIB.Save(aMasterDevice: TMasterDevice): Integer;
var
Qry: TUniQuery;
begin
Result := -1;
Qry := CreateQuery;
try
case aMasterDevice.State of
ddsNew:
begin
Qry.SQL.Text := GetSQLByName('SER_INSERT_MASTERDEVICE');
Qry.ParamByName('DTI').AsInteger := Ord(aMasterDevice.DeviceType);
Qry.ParamByName('FNA').AsString := aMasterDevice.Name;
Qry.ParamByName('FCA').AsString := aMasterDevice.Caption;
Qry.ParamByName('MOD').AsString := aMasterDevice.Version.Model;
Qry.ParamByName('APP').AsString := aMasterDevice.Version.AppVersion;
Qry.ParamByName('SYS').AsString := aMasterDevice.Version.SysVersion;
Qry.ParamByName('FHO').AsString := aMasterDevice.Host;
Qry.ParamByName('USN').AsString := aMasterDevice.UserName;
Qry.ParamByName('PAW').AsString := aMasterDevice.PasswordEncrypted;
Qry.ParamByName('ACT').AsInteger := Integer(aMasterDevice.Active);
Qry.ParamByName('ISV').AsInteger := Integer(aMasterDevice.IsValid);
Qry.ParamByName('CON').AsString := aMasterDevice.ConfigurationName;
Qry.ParamByName('LRD').AsInteger := aMasterDevice.LastReadDeviceID;
Qry.ExecSQL;
aMasterDevice.ID := Qry.ParamByName('RET_ID').AsInteger;
Result := aMasterDevice.ID;
end;
ddsEdit:
begin
Qry.SQL.Text := GetSQLByName('SER_EDIT_MASTERDEVICE');
Qry.ParamByName('ID').AsInteger := aMasterDevice.ID;
Qry.ParamByName('DTI').AsInteger := Ord(aMasterDevice.DeviceType);
Qry.ParamByName('FNA').AsString := aMasterDevice.Name;
Qry.ParamByName('FCA').AsString := aMasterDevice.Caption;
Qry.ParamByName('MOD').AsString := aMasterDevice.Version.Model;
Qry.ParamByName('APP').AsString := aMasterDevice.Version.AppVersion;
Qry.ParamByName('SYS').AsString := aMasterDevice.Version.SysVersion;
Qry.ParamByName('FHO').AsString := aMasterDevice.Host;
Qry.ParamByName('USN').AsString := aMasterDevice.UserName;
Qry.ParamByName('PAW').AsString := aMasterDevice.PasswordEncrypted;
Qry.ParamByName('ACT').AsInteger := Integer(aMasterDevice.Active);
Qry.ParamByName('ISV').AsInteger := Integer(aMasterDevice.IsValid);
Qry.ParamByName('CON').AsString := aMasterDevice.ConfigurationName;
Qry.ParamByName('LRD').AsInteger := aMasterDevice.LastReadDeviceID;
Qry.ExecSQL;
aMasterDevice.State := ddsNormal;
Result := aMasterDevice.ID;
end;
ddsDeleted:
begin
Qry.SQL.Text := GetSQLByName('SER_DELETE_MASTERDEVICE');
Qry.ParamByName('ID').AsInteger := aMasterDevice.ID;
Qry.ExecSQL;
Result := aMasterDevice.ID;
end;
end;
finally
Qry.Free;
end;
end;
...
FDatabase.Save(MasterDevice); // fertsch
GetSQLByName('SER_EDIT_MASTERDEVICE')
gehört zu
SQL Speichern in Ressourcen.
http://www.delphipraxis.net/190316-d...e-creator.html siehe Handbuch.
Zum Gesamten gehört auch der Aufbau der Connection u.a. dazu. Wenn du deine
SQL aber über das ganze Programm verteilt hast, wird es eher schwierig diese Konzept durchzusetzen.