持久对象往往只能存在一个数据库Connection之中,Connnection关闭以后,持久对象就不应该存在了。
下面的类TDataController封装了TADOConnection类,包含了数据库的连接信息,对Delphi数据库应用程序来说,通常在启动要实例化一个TDataController类的对象。
应用程序如果访问多个数据源时,需要实例化多个TDataController类的对象。一个数据源对应一个TDataController对象,减少资源的消耗。
与TTableData类似,TDataController继承自TPersistent。
unit UnitDataController;
interface
uses
classes, ADODB, SysUtils, DB;
type
TDataController = class(TPersistent)
private
FConnect: string;
FConnection: TADOConnection;
procedure CreateConnection;
function GetConnected: Boolean;
procedure SetConnectString(const Value: string);
protected
procedure InitializeObject;
public
constructor Create(AConnect: string); reintroduce;
destructor Destroy; override;
procedure CloseConnection;
function CreateCommand(AText: string; AType: TCommandType): TPersistent;
function OpenConnection: Boolean;
published
property Connected: Boolean read GetConnected;
property Connection: TADOConnection read FConnection;
property ConnectString: string read FConnect write SetConnectString;
end;
implementation
uses UnitAppLogger, UnitDataCommand;
{ TDataController }
{
******************************* TDataController ********************************
}
constructor TDataController.Create(AConnect: string);
begin
FConnect := AConnect;
InitializeObject;
end;
destructor TDataController.Destroy;
begin
CloseConnection;
FConnection.Free;
inherited;
end;
procedure TDataController.CloseConnection;
begin
if (FConnection <> nil) and FConnection.Connected then
begin
FConnection.Close;
end;
end;
function TDataController.CreateCommand(AText: string; AType: TCommandType)
: TPersistent;
begin
result := TDataCommand.Create(Self);
with (result as TDataCommand) do
begin
CommandText := AText;
CommandType := AType;
end;
end;
procedure TDataController.CreateConnection;
begin
FConnection := TADOConnection.Create(nil);
FConnection.ConnectionString := FConnect;
FConnection.LoginPrompt := False;
end;
function TDataController.GetConnected: Boolean;
begin
result := FConnection.Connected;
end;
procedure TDataController.InitializeObject;
begin
CreateConnection;
end;
function TDataController.OpenConnection: Boolean;
begin
if FConnection = nil then
CreateConnection;
result := FConnection.Connected;
if result then
Exit;
try
// CloseConnection;
FConnection.Open;
result := FConnection.Connected;
except
on e: Exception do
begin
FConnection.Close;
AppLogger.AddLog(Self, 'TDataController.OpenConnection: %s', [e.Message]);
raise;
end;
end; // try/except
end;
procedure TDataController.SetConnectString(const Value: string);
begin
if FConnect <> Value then
begin
FConnect := Value;
if FConnection.Connected then
FConnection.Close;
FConnection.ConnectionString := FConnect;
end;
end;
end.