Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

Re: Datenbankanwendung sauber strukturieren und programmiere

  Alt 3. Nov 2008, 11:53
Hi,

eine entsprechende Abstraktion gelingt über TDataSet.
Dazu hier ein kleines Beispiel:

Die Datenklasse (mit ADO auf Access)
Delphi-Quellcode:
unit datADO;

interface

uses
  SysUtils, Classes, DB, ADODB;

type
  TADOmod = class(TDataModule)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function GetTable( const ATableName : string; var ADataSet : TDataSet ) : boolean;
    function GetQuery( const ASqlQuery : string; var ADataSet : TDataSet ) : boolean;
    function ExecSql( const ASqlStatement : string; var ARecordsAffected : integer ) : boolean;
  end;

var
  ADOmod: TADOmod;

implementation

const
  DBconn = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False';
  DBpath = '..\db\DBabstract.mdb';

{$R *.dfm}

procedure TADOmod.DataModuleCreate(Sender: TObject);
begin
  if ADOConnection1.Connected then
    ADOConnection1.Close;
  ADOConnection1.ConnectionString :=
    Format( DBconn, [ DBpath ] );
end;

procedure TADOmod.DataModuleDestroy(Sender: TObject);
begin
  if ADOConnection1.Connected then
    ADOConnection1.Close;
end;

function TADOmod.ExecSql(const ASqlStatement: string; var ARecordsAffected: integer): boolean;
begin
  try
    ADOConnection1.Execute( ASqlStatement, ARecordsAffected );
    Result := true;
  except
    Result := false;
  end;
end;

function TADOmod.GetQuery(const ASqlQuery: string;
  var ADataSet: TDataSet): boolean;
begin
  ADataSet := TADOTable.Create( Self );
  try
    with TADOQuery( ADataSet )
    do
      begin
        Connection := ADOConnection1;
        SQL.Text := ASqlQuery;
      end;
    Result := true;
  except
    Result := false;
    FreeAndNil( ADataSet );
  end;
end;

function TADOmod.GetTable(const ATableName: string; var ADataSet: TDataSet) : boolean;
begin
  ADataSet := TADOTable.Create( Self );
  try
    with TADOTable( ADataSet )
    do
      begin
        Connection := ADOConnection1;
        TableName := ATableName;
      end;
    Result := true;
  except
    Result := false;
    FreeAndNil( ADataSet );
  end;
end;

end.
Und so wird die verwendet (ein Button, ein Datengrid und eine damit verknüpfte DataSource)
Delphi-Quellcode:
unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, Grids, DBGrids;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses datADO;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyDataSet : TDataSet;
begin
  if ADOmod.GetTable( 'Personen', MyDataSet )
  then
    begin
      MyDataSet.Open;
      DataSource1.DataSet := MyDataSet;
    end;
end;

end.
Als weiterer Hinweis seien noch die StoredProcedures genannt, die z.B. bei MSSQL, MySQL, etc. möglich sind.
Hier kann eine Schnittstellen-Ebene geschaffen werden, die die DB-Entwicklung von der Programm-Entwicklung trennt.
Änderungen an der DB-Struktur ziehen nur Änderungen an den StoredProcedures nach sich (natürlich nur, wenn die Ein- und Ausgabe-Parameter sich nicht ändern). Aber wenn man aus einer Tabelle nun jetzt 2 machen möchte, das grundsätzliche Ein- und Ausgabeverhalten hat sich aber nicht geändert, so habe ich nur die Änderungen auf der DB-Seite und das Prog bleibt unangetastet.

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat