Delphi和C++ Builder中的Hibernate开发(三)

持久对象往往只能存在一个数据库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.

 

转载于:https://www.cnblogs.com/gowithyou/archive/2012/02/25/2368237.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值