sqlserveruniprovider.pas

来自「CrLab UniDAC 1.0 include sources」· PAS 代码 · 共 290 行

PAS
290
字号
{$IFNDEF CLR}
{$I Sdac.inc}
unit SQLServerUniProvider;
{$ENDIF}

interface

uses
  SysUtils, Classes, Variants, DB, CRAccess, CRConnectionPool, MemData, MemDS, DBAccess,
  CRParser, DAScript, UniProvider,
{$IFNDEF UNIDACPRO}
  OLEDBAccess;
{$ELSE}
  OLEDBAccessUni;
{$ENDIF}

type
  TSQLServerUniProvider = class(TUniProvider)
  public
    class function GetProviderName: string; override;

    function IsDatabaseSupported: boolean; override;

    function GetParserClass: TParserClass; override;
    function GetConnectionParametersClass: TCRConnectionParametersClass; override;
    function GetConnectionPoolingManagerClass: TCRConnectionPoolManagerClass; override;
    function GetConnectionClass: TCRConnectionClass; override;
    function GetServerEnumeratorClass: TCRServerEnumeratorClass; override;    
    function GetTransactionClass: TCRTransactionClass; override;
    function GetCommandClass: TCRCommandClass; override;
    function GetRecordSetClass: TCRRecordSetClass; override;
    function GetDataSetServiceClass: TDADataSetServiceClass; override;
    function GetScriptProcessorClass: TDAScriptProcessorClass; override;
    function GetMetaDataClass: TCRMetaDataClass; override;
    function GetConnectDialogServiceClass: TConnectDialogServiceClass; override;
    function GetDataTypesMap: TDataTypesMapClass; override;

    procedure SetObjectProps(Obj: TObject; Options: TStrings; SetAllProps: boolean); override;

    function GetConnectionOptions: TOptionsList; override;
    function GetSQLOptions: TOptionsList; override;
    function GetDataSetOptions: TOptionsList; override;
    function GetScriptOptions: TOptionsList; override;
  end;

  TMSConnectDialogService = class (TConnectDialogService)
  private
    FProvider: TOLEDBProvider;
  public
    function SetProp(Prop: integer; const Value: variant): boolean; override;
    function UseDatabaseHistory: boolean; override;
    function UsernameEnabled: boolean; override;
    function ServerEnabled: boolean; override;
  end;

procedure RegisterComponent;

implementation

uses
  TypInfo,
{$IFNDEF UNIDACPRO}
  MSParser, MSConnectionPool, MSServices, MSScriptProcessor;
{$ELSE}
  MSParserUni, MSConnectionPoolUni, MSServicesUni, MSScriptProcessorUni;
{$ENDIF}

class function TSQLServerUniProvider.GetProviderName: string;
begin
  Result := 'SQL Server';
end;

function TSQLServerUniProvider.IsDatabaseSupported: boolean;
begin
  Result := True;
end;

function TSQLServerUniProvider.GetParserClass: TParserClass;
begin
  Result := TMSParser;
end;

function TSQLServerUniProvider.GetConnectionParametersClass: TCRConnectionParametersClass;
begin
  Result := TMSConnectionParameters;
end;

function TSQLServerUniProvider.GetConnectionPoolingManagerClass: TCRConnectionPoolManagerClass;
begin
  Result := TMSConnectionPoolManager;
end;

function TSQLServerUniProvider.GetConnectionClass: TCRConnectionClass;
begin
  Result := TOLEDBConnection;
end;

function TSQLServerUniProvider.GetServerEnumeratorClass: TCRServerEnumeratorClass;
begin
  Result := TMSServerEnumerator;
end;

function TSQLServerUniProvider.GetTransactionClass: TCRTransactionClass;
begin
  Result := TOLEDBTransaction;
end;

function TSQLServerUniProvider.GetCommandClass: TCRCommandClass;
begin
  Result := TOLEDBCommand;
end;

function TSQLServerUniProvider.GetRecordSetClass: TCRRecordSetClass;
begin
  Result := TOLEDBRecordSet;
end;

function TSQLServerUniProvider.GetDataSetServiceClass: TDADataSetServiceClass;
begin
  Result := TCustomMSDataSetService;
end;

function TSQLServerUniProvider.GetScriptProcessorClass: TDAScriptProcessorClass;
begin
  Result := TMSScriptProcessor;
end;

function TSQLServerUniProvider.GetMetaDataClass: TCRMetaDataClass;
begin
  Result := TOLEDBMetaData;
end;

function TSQLServerUniProvider.GetConnectDialogServiceClass: TConnectDialogServiceClass;
begin
  Result := TMSConnectDialogService;
end;

function TSQLServerUniProvider.GetDataTypesMap: TDataTypesMapClass;
begin
  Result := TCustomMSDataTypesMap;
end;

procedure TSQLServerUniProvider.SetObjectProps(Obj: TObject; Options: TStrings; SetAllProps: boolean);
begin
  if Obj.ClassType = TOLEDBConnection then begin
    TOLEDBConnection(Obj).SetProp(prSetLockTimeout, True);    
    GetConnectionOptions.ImportOptions(Options, Obj, TOLEDBConnection(Obj).SetProp, SetAllProps)
  end  
  else
  if Obj.ClassType = TMSConnectionParameters then
    GetConnectionOptions.ImportOptions(Options, Obj, TMSConnectionParameters(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TMSServerEnumerator then
    GetConnectionOptions.ImportOptions(Options, Obj, TMSServerEnumerator(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TMSConnectDialogService then
    GetConnectionOptions.ImportOptions(Options, Obj, TMSConnectDialogService(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TOLEDBCommand then begin
    TOLEDBCommand(Obj).SetProp(prSensibleBCDMapping, True);    
    GetSQLOptions.ImportOptions(Options, Obj, TOLEDBCommand(Obj).SetProp, SetAllProps);
  end
  else
  if Obj.ClassType = TOLEDBRecordSet then begin
    TOLEDBREcordSet(Obj).GetCommand.SetProp(prSensibleBCDMapping, True);       
    GetDataSetOptions.ImportOptions(Options, Obj, TOLEDBRecordSet(Obj).SetProp, SetAllProps);
    GetDataSetOptions.ImportOptions(Options, TOLEDBRecordSet(Obj).GetCommand, TOLEDBRecordSet(Obj).GetCommand.SetProp, SetAllProps);
  end
  else
  if Obj.ClassType = TCustomMSDataSetService then
    GetDataSetOptions.ImportOptions(Options, Obj, TCustomMSDataSetService(Obj).SetProp, SetAllProps)
  else
  if Obj.ClassType = TMSScriptProcessor then
    GetScriptOptions.ImportOptions(Options, Obj, TMSScriptProcessor(Obj).SetProp, SetAllProps); 
end;

function TSQLServerUniProvider.GetConnectionOptions: TOptionsList;
begin
  if FConnectionOptions = nil then begin

    FConnectionOptions := TOptionsList.Create(GetProviderName);
    FConnectionOptions.Add(TBooleanOption.Create('QuotedIdentifier', prQuotedIdentifier, [TOLEDBConnection, TMSConnectionParameters], True));
    FConnectionOptions.Add(TBooleanOption.Create('Encrypt', prEncrypt, [TOLEDBConnection, TMSConnectionParameters], False));
    FConnectionOptions.Add(TEnumeratorOption.Create('OLEDBProvider', prProvider, [TOLEDBConnection, TMSConnectionParameters, TMSServerEnumerator, TMSConnectDialogService], Variant(prAuto), TypeInfo(TOLEDBProvider)));

    // TMSConnection options
    FConnectionOptions.Add(TEnumeratorOption.Create('Authentication', prAuthentication, [TOLEDBConnection, TMSConnectionParameters], Variant(auServer), TypeInfo(TMSAuthentication)));
    FConnectionOptions.Add(TIntegerOption.Create('ConnectionTimeout', prConnectionTimeout, [TOLEDBConnection], 15));
    FConnectionOptions.Add(TStringOption.Create('Language', prLanguage, [TOLEDBConnection, TMSConnectionParameters], ''));
    FConnectionOptions.Add(TBooleanOption.Create('PersistSecurityInfo', prPersistSecurityInfo, [TOLEDBConnection, TMSConnectionParameters], False));
    FConnectionOptions.Add(TBooleanOption.Create('AutoTranslate', prAutoTranslate, [TOLEDBConnection, TMSConnectionParameters], True));
    FConnectionOptions.Add(TStringOption.Create('NetworkLibrary', prNetworkLibrary, [TOLEDBConnection, TMSConnectionParameters], ''));
    FConnectionOptions.Add(TStringOption.Create('ApplicationName', prApplicationName, [TOLEDBConnection, TMSConnectionParameters], ''));
    FConnectionOptions.Add(TStringOption.Create('WorkstationID', prWorkstationID, [TOLEDBConnection, TMSConnectionParameters], ''));
    FConnectionOptions.Add(TIntegerOption.Create('PacketSize', prPacketSize, [TOLEDBConnection, TMSConnectionParameters], 4096));
    FConnectionOptions.Add(TStringOption.Create('InitialFileName', prInitialFileName, [TOLEDBConnection], ''));
    FConnectionOptions.Add(TBooleanOption.Create('MultipleActiveResultSets', prMARS, [TOLEDBConnection], False));
    FConnectionOptions.Add(TStringOption.Create('FailoverPartner', prFailoverPartner, [TOLEDBConnection], ''));
    FConnectionOptions.Add(TBooleanOption.Create('TrustServerCertificate', prTrustServerCertificate, [TOLEDBConnection], False));
    FConnectionOptions.Add(TIntegerOption.Create('LockTimeout', prDefaultLockTimeout, [TOLEDBConnection], DefaultDefaultLockTimeout));

    // TCompactConnection options
    FConnectionOptions.Add(TEnumeratorOption.Create('CompactInitMode', prInitMode, [TOLEDBConnection], Variant(imReadWrite), TypeInfo(TMSInitMode)));
    FConnectionOptions.Add(TIntegerOption.Create('CompactLockEscalation', prLockEscalation, [TOLEDBConnection], 100));
    FConnectionOptions.Add(TEnumeratorOption.Create('CompactTransactionCommitMode', prTransactionCommitMode, [TOLEDBConnection], Variant(cmAsynchCommit), TypeInfo(TCompactCommitMode)));
    FConnectionOptions.Add(TIntegerOption.Create('CompactMaxDatabaseSize', prMaxDatabaseSize, [TOLEDBConnection], 128));
    FConnectionOptions.Add(TIntegerOption.Create('CompactMaxBufferSize', prMaxBufferSize, [TOLEDBConnection], 640));
    FConnectionOptions.Add(TStringOption.Create('CompactTempFileDirectory', prTempFileDirectory, [TOLEDBConnection], ''));
    FConnectionOptions.Add(TIntegerOption.Create('CompactTempFileMaxSize', prTempFileMaxSize, [TOLEDBConnection], 128));
    FConnectionOptions.Add(TIntegerOption.Create('CompactDefaultLockEscalation', prDefaultLockEscalation, [TOLEDBConnection], 100));
    FConnectionOptions.Add(TIntegerOption.Create('CompactAutoShrinkThreshold', prAutoShrinkThreshold, [TOLEDBConnection], 60));
    FConnectionOptions.Add(TIntegerOption.Create('CompactFlushInterval', prFlushInterval, [TOLEDBConnection], 10));
    FConnectionOptions.Add(TEnumeratorOption.Create('CompactVersion', prCompactVersion, [TOLEDBConnection], Variant(cvAuto), TypeInfo(TCompactVersion)));
  end;
  Result := FConnectionOptions;
end;

function TSQLServerUniProvider.GetSQLOptions: TOptionsList;
begin
  if FSQLOptions = nil then begin
    FSQLOptions := TOptionsList.Create(GetProviderName);
    FSQLOptions.Add(TIntegerOption.Create('CommandTimeout', prCommandTimeout, [TOLEDBCommand], 0));
  end;
  Result := FSQLOptions;
end;

function TSQLServerUniProvider.GetDataSetOptions: TOptionsList;
begin
  if FDataSetOptions = nil then begin
    FDataSetOptions := TOptionsList.Create(GetProviderName);

    FDataSetOptions.Add(TBooleanOption.Create('FetchAll', prFetchAll, [TOLEDBRecordSet], True));
    FDataSetOptions.Add(TIntegerOption.Create('CommandTimeout', prCommandTimeout, [TOLEDBRecordSet], 0));
    FDataSetOptions.Add(TBooleanOption.Create('UniqueRecords', prUniqueRecords, [TOLEDBRecordSet], False));
    FDataSetOptions.Add(TBooleanOption.Create('CursorUpdate', prCursorUpdate, [TOLEDBRecordSet], True));
    FDataSetOptions.Add(TBooleanOption.Create('QueryIdentity', prQueryIdentity, [TCustomMSDataSetService], True));
    FDataSetOptions.Add(TBooleanOption.Create('CheckRowVersion', prCheckRowVersion, [TCustomMSDataSetService], False));
  end;
  Result := FDataSetOptions;
end;

function TSQLServerUniProvider.GetScriptOptions: TOptionsList;
begin
  if FScriptOptions = nil then begin
    FScriptOptions := TOptionsList.Create(GetProviderName);
  end;
  Result := FScriptOptions;
end;

{ TMSConnectDialogService }

function TMSConnectDialogService.SetProp(Prop: integer; const Value: variant): boolean;
begin
  Result := True;
  case Prop of
    prProvider:
      FPRovider := TOLEDBProvider(Value);
  else
    Result := inherited SetProp(Prop, Value);    
  end;  
end;

function TMSConnectDialogService.UseDatabaseHistory: boolean;
begin
  Result := FPRovider = prCompact;
end;

function TMSConnectDialogService.UsernameEnabled: boolean;
begin
  Result := FPRovider <> prCompact;
end;

function TMSConnectDialogService.ServerEnabled: boolean;
begin
  Result := FPRovider <> prCompact;
end;

procedure RegisterComponent;
begin
  RegisterComponents('UniDAC', [TSQLServerUniProvider]);
end;

initialization
  UniProviders.RegisterProvider(TSQLServerUniProvider);

finalization
  UniProviders.UnRegisterProvider(TSQLServerUniProvider);

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?