{----------------------------------------------------------------------------- Unit Name: UCMidasConn Author : Luiz Benevenuto Date : 31/07/2005 Purpose : Midas Suporte ( DataSnap ) E-mail : luiz@siffra.com URL : www.siffra.com UC : www.usercontrol.com.br Forum : http://www.usercontrol.com.br/modules.php?name=Forums registered in UCMidasConnReg.pas -----------------------------------------------------------------------------} unit uUCROConn; interface //{$I 'UserControl.inc'} uses Classes, DB, DBClient, SysUtils, UCDataConnector, uRORemoteService, uDADataStreamer, uDABin2DataStreamer, uDARemoteDataAdapter; type TUCROConn = class(TUCDataConnector) private FRemoteService: TRORemoteService; FDataAdapter : TDARemoteDataAdapter; FDataStreamer : TDABin2DataStreamer; procedure SetRemoteService(const Value: TRORemoteService); protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; public function GetDBObjectName: String; override; function GetTransObjectName: String; override; function UCFindDataConnection: Boolean; override; function UCFindTable(const Tablename: String): Boolean; override; function UCGetSQLDataset(FSQL: String): TDataset; override; procedure UCExecSQL(FSQL: String); override; constructor Create(AOwner: TComponent); override; destructor Destroy; override; published property RemoteService : TRORemoteService read FRemoteService write SetRemoteService; end; implementation uses Forms, Dialogs, FactuGES_Intf, uROTypes, uDAClasses, uDADataTable, uDACDSDataTable; { TUCROConn } constructor TUCROConn.Create(AOwner: TComponent); begin inherited; FDataStreamer := TDABin2DataStreamer.Create(nil); FDataAdapter := TDARemoteDataAdapter.Create(nil); FDataAdapter.DataStreamer := FDataStreamer; FDataAdapter.SetupDefaultRequest; end; destructor TUCROConn.Destroy; begin FreeAndNil(FDataAdapter); FreeAndNil(FDataStreamer); inherited; end; function TUCROConn.GetDBObjectName: String; begin if Assigned(FRemoteService) then begin if Owner = FRemoteService.Owner then Result := FRemoteService.Name else Result := FRemoteService.Owner.Name + '.' + FRemoteService.Name; end else Result := ''; end; function TUCROConn.GetTransObjectName: String; begin Result := ''; end; procedure TUCROConn.Notification(AComponent: TComponent; Operation: TOperation); begin if (Operation = opRemove) and (AComponent = FRemoteService) then begin FreeAndNil(FDataAdapter); FRemoteService := nil; end; inherited Notification(AComponent, Operation); end; procedure TUCROConn.SetRemoteService(const Value: TRORemoteService); begin FRemoteService := Value; if Assigned(FRemoteService) then begin with FDataAdapter do begin RemoteService := FRemoteService; GetSchemaCall.RemoteService := FRemoteService; GetDataCall.RemoteService := FRemoteService; UpdateDataCall.RemoteService := FRemoteService; GetScriptsCall.RemoteService := FRemoteService; end; end; end; procedure TUCROConn.UCExecSQL(FSQL: String); begin (FRemoteService as IsrvUsuarios).SQLExecuteCommand(FSQL); end; function TUCROConn.UCFindDataConnection: Boolean; begin Result := False; if Assigned(FRemoteService) then begin FRemoteService.CheckCanConnect; Result := True; end; end; function TUCROConn.UCFindTable(const Tablename: String): Boolean; var ASchema : TDASchema; begin ASchema := FDataAdapter.ReadSchema; try Result := Assigned(ASchema.FindDataset(TableName)); finally FreeAndNil(ASchema); end; end; function TUCROConn.UCGetSQLDataset(FSQL: String): TDataset; var AStream: TMemoryStream; ADataStreamer: TDABin2DataStreamer; ADataTable: TDACDSDataTable; begin ADataStreamer := TDABin2DataStreamer.Create(NIL); AStream := (FRemoteService as IsrvUsuarios).SQLGetData(FSQL, True, -1); if AStream <> nil then try ADataTable := TDACDSDataTable.Create(Application); // Generar un nombre aleatorio Randomize; ADataTable.Name := 'SQLResult' + '_' + IntToStr(Random(MAXINT)); ADataTable.LocalDataStreamer := ADataStreamer; ADataTable.RemoteFetchEnabled := False; try ADataStreamer.ReadDataset(AStream, ADataTable, True); Result := ADataTable.Dataset; finally //FreeAndNIL(ADataTable); <-- No liberar, lo hace Application end; finally FreeAndNIL(AStream); FreeAndNIL(ADataStreamer); end; end; end.