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