📄 frxadocomponents.pas
字号:
{******************************************}
{ }
{ FastReport v4.0 }
{ ADO enduser components }
{ }
{ Copyright (c) 1998-2008 }
{ by Alexander Tzyganenko, }
{ Fast Reports Inc. }
{ }
{******************************************}
unit frxADOComponents;
interface
{$I frx.inc}
uses
Windows, Classes, SysUtils, frxClass, frxCustomDB, DB, ADODB, ADOInt
{$IFDEF Delphi6}
, Variants
{$ENDIF}
{$IFDEF QBUILDER}
, fqbClass
{$ENDIF}
;
type
TfrxADOComponents = class(TfrxDBComponents)
private
FDefaultDatabase: TADOConnection;
FOldComponents: TfrxADOComponents;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetDescription: String; override;
published
property DefaultDatabase: TADOConnection read FDefaultDatabase write FDefaultDatabase;
end;
TfrxADODatabase = class(TfrxCustomDatabase)
private
FDatabase: TADOConnection;
protected
procedure SetConnected(Value: Boolean); override;
procedure SetDatabaseName(const Value: String); override;
procedure SetLoginPrompt(Value: Boolean); override;
function GetConnected: Boolean; override;
function GetDatabaseName: String; override;
function GetLoginPrompt: Boolean; override;
procedure ADOBeforeConnect(Sende: TObject);
public
constructor Create(AOwner: TComponent); override;
class function GetDescription: String; override;
procedure SetLogin(const Login, Password: String); override;
function ToString: WideString; override;
procedure FromString(const Connection: WideString); override;
property Database: TADOConnection read FDatabase;
published
property DatabaseName;
property LoginPrompt;
property Connected;
end;
TfrxADOTable = class(TfrxCustomTable)
private
FDatabase: TfrxADODatabase;
FTable: TADOTable;
procedure SetDatabase(Value: TfrxADODatabase);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetMaster(const Value: TDataSource); override;
procedure SetMasterFields(const Value: String); override;
procedure SetIndexFieldNames(const Value: String); override;
procedure SetIndexName(const Value: String); override;
procedure SetTableName(const Value: String); override;
function GetIndexFieldNames: String; override;
function GetIndexName: String; override;
function GetTableName: String; override;
public
constructor Create(AOwner: TComponent); override;
constructor DesignCreate(AOwner: TComponent; Flags: Word); override;
class function GetDescription: String; override;
procedure BeforeStartReport; override;
property Table: TADOTable read FTable;
published
property Database: TfrxADODatabase read FDatabase write SetDatabase;
end;
TfrxADOQuery = class(TfrxCustomQuery)
private
FDatabase: TfrxADODatabase;
FQuery: TADOQuery;
FStrings: TStrings;
FLock: Boolean;
procedure SetDatabase(Value: TfrxADODatabase);
function GetCommandTimeout: Integer;
procedure SetCommandTimeout(const Value: Integer);
{$IFDEF Delphi7}
function GetLockType: TADOLockType;
procedure SetLockType(const Value: TADOLockType);
{$ENDIF}
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure OnChangeSQL(Sender: TObject); override;
procedure SetMaster(const Value: TDataSource); override;
procedure SetSQL(Value: TStrings); override;
function GetSQL: TStrings; override;
public
constructor Create(AOwner: TComponent); override;
constructor DesignCreate(AOwner: TComponent; Flags: Word); override;
destructor Destroy; override;
class function GetDescription: String; override;
procedure BeforeStartReport; override;
procedure UpdateParams; override;
{$IFDEF QBUILDER}
function QBEngine: TfqbEngine; override;
{$ENDIF}
property Query: TADOQuery read FQuery;
published
property CommandTimeout: Integer read GetCommandTimeout write SetCommandTimeout;
property Database: TfrxADODatabase read FDatabase write SetDatabase;
{$IFDEF Delphi7}
property LockType: TADOLockType read GetLockType write SetLockType;
{$ENDIF}
end;
{$IFDEF QBUILDER}
TfrxEngineADO = class(TfqbEngine)
private
FQuery: TADOQuery;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReadTableList(ATableList: TStrings); override;
procedure ReadFieldList(const ATableName: string; var AFieldList: TfqbFieldList); override;
function ResultDataSet: TDataSet; override;
procedure SetSQL(const Value: string); override;
end;
{$ENDIF}
procedure frxParamsToTParameters(Query: TfrxCustomQuery; Params: TParameters);
procedure frxADOGetTableNames(conADO: TADOConnection; List: TStrings; SystemTables: Boolean);
var
ADOComponents: TfrxADOComponents;
implementation
uses
frxADORTTI,
{$IFNDEF NO_EDITORS}
frxADOEditor,
{$ENDIF}
frxDsgnIntf, frxRes;
type
THackQuery = class(TADOQuery);
{ frxParamsToTParameters }
procedure frxParamsToTParameters(Query: TfrxCustomQuery; Params: TParameters);
var
i: Integer;
Item: TfrxParamItem;
begin
for i := 0 to Params.Count - 1 do
if Query.Params.IndexOf(Params[i].Name) <> -1 then
begin
Item := Query.Params[Query.Params.IndexOf(Params[i].Name)];
Params[i].DataType := Item.DataType;
Params[i].Attributes := [paNullable];
if Trim(Item.Expression) <> '' then
if not (Query.IsLoading or Query.IsDesigning) then
begin
Query.Report.CurObject := Query.Name;
Item.Value := Query.Report.Calc(Item.Expression);
end;
Params[i].Value := Item.Value;
end;
end;
procedure frxADOGetTableNames(conADO: TADOConnection; List: TStrings; SystemTables: Boolean);
var
tbl: TADODataSet;
s: string;
begin
tbl := TADODataSet.Create(nil);
List.Clear;
try
conADO.OpenSchema(siTables, EmptyParam, EmptyParam, tbl);
tbl.First;
while not tbl.Eof do
begin
s := Trim(tbl.FieldByName('TABLE_SCHEMA').AsString);
if s <> '' then
List.Add(s + '.' + tbl.FieldByName('TABLE_NAME').AsString)
else
List.Add(tbl.FieldByName('TABLE_NAME').AsString);
tbl.Next;
end;
finally
tbl.Free;
end;
end;
{ TfrxDBComponents }
constructor TfrxADOComponents.Create(AOwner: TComponent);
begin
inherited;
FOldComponents := ADOComponents;
ADOComponents := Self;
end;
destructor TfrxADOComponents.Destroy;
begin
if ADOComponents = Self then
ADOComponents := FOldComponents;
inherited;
end;
function TfrxADOComponents.GetDescription: String;
begin
Result := 'ADO';
end;
procedure TfrxADOComponents.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
if (AComponent = FDefaultDatabase) and (Operation = opRemove) then
FDefaultDatabase := nil;
end;
{ TfrxADODatabase }
constructor TfrxADODatabase.Create(AOwner: TComponent);
begin
inherited;
FDatabase := TADOConnection.Create(nil);
FDatabase.BeforeConnect := ADOBeforeConnect;
Component := FDatabase;
end;
class function TfrxADODatabase.GetDescription: String;
begin
Result := frxResources.Get('obADODB');
end;
function TfrxADODatabase.GetConnected: Boolean;
begin
Result := FDatabase.Connected;
end;
function TfrxADODatabase.GetDatabaseName: String;
begin
Result := FDatabase.ConnectionString;
end;
function TfrxADODatabase.GetLoginPrompt: Boolean;
begin
Result := FDatabase.LoginPrompt;
end;
procedure TfrxADODatabase.SetConnected(Value: Boolean);
begin
BeforeConnect(Value);
FDatabase.Connected := Value;
end;
procedure TfrxADODatabase.SetDatabaseName(const Value: String);
begin
FDatabase.ConnectionString := Value;
end;
procedure TfrxADODatabase.SetLoginPrompt(Value: Boolean);
begin
FDatabase.LoginPrompt := Value;
end;
procedure TfrxADODatabase.SetLogin(const Login, Password: String);
var
i, j: Integer;
s: String;
begin
s := DatabaseName;
i := Pos('USER ID=', AnsiUppercase(s));
if i <> 0 then
begin
for j := i to Length(s) do
if s[j] = ';' then
break;
Delete(s, i, j - i);
Insert('User ID=' + Login, s, i);
end
else
s := s + ';User ID=' + Login;
i := Pos('PASSWORD=', AnsiUppercase(s));
if i <> 0 then
begin
for j := i to Length(s) do
if s[j] = ';' then
break;
Delete(s, i, j - i);
Insert('Password=' + Password, s, i);
end
else
s := s + ';Password=' + Password;
DatabaseName := s;
end;
procedure TfrxADODatabase.FromString(const Connection: WideString);
begin
FDatabase.ConnectionString := Connection;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -