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.