Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.300 Beiträge
 
Delphi 12 Athens
 
#2

AW: Benutzer aus TObjectlist speichern

  Alt 4. Feb 2018, 06:35
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.

Geändert von haentschman ( 4. Feb 2018 um 06:43 Uhr)
  Mit Zitat antworten Zitat