📄 ibxdatadrivereh.pas
字号:
{*******************************************************}
{ }
{ EhLib vX.X }
{ }
{ TIBXDataDriverEh component (Build 11) }
{ }
{ Copyright (c) 2003,04 by Dmitry V. Bolshakov }
{ }
{*******************************************************}
unit IBXDataDriverEh;
{$I EHLIB.INC}
interface
uses Windows, SysUtils, Classes, Controls, DB,
{$IFDEF EH_LIB_6} Variants, {$ENDIF}
{$IFDEF EH_LIB_5} Contnrs, {$ENDIF}
ToolCtrlsEh, DBCommon, MemTableDataEh, DataDriverEh,
IBCustomDataSet, IBDatabase, IBQuery, IBTable, IBStoredProc;
type
TIBXDataDriverEh = class;
{ TIBXCommandEh }
TIBXCommandEh = class(TBaseSQLCommandEh)
private
function GetDataDriver: TIBXDataDriverEh;
public
function Execute(var Cursor: TDataSet; var FreeOnEof: Boolean): Integer; override;
property DataDriver: TIBXDataDriverEh read GetDataDriver;
published
property Params;
property ParamCheck;
property CommandText;
property CommandType;
end;
{ TIBXDataDriverEh }
TIBXDataDriverEh = class(TBaseSQLDataDriverEh)
private
FSpecParams: TStrings;
FDatabase: TIBDatabase;
procedure SetSpecParams(const Value: TStrings);
procedure SetDatabase(const Value: TIBDatabase);
protected
function CreateSelectCommand: TCustomSQLCommandEh; override;
function CreateUpdateCommand: TCustomSQLCommandEh; override;
function CreateInsertCommand: TCustomSQLCommandEh; override;
function CreateDeleteCommand: TCustomSQLCommandEh; override;
function CreateGetrecCommand: TCustomSQLCommandEh; override;
procedure SetAutoIncFields(Fields: TFields; DataStruct: TMTDataStructEh); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function CreateDesignCopy: TCustomSQLDataDriverEh; override;
function CreateDesignDataBase: IInterface; override;
procedure GetBackUpdatedValues(MemRec: TMemoryRecordEh; Command: TCustomSQLCommandEh; ResDataSet: TDataSet); override;
procedure DoServerSpecOperations(MemRec: TMemoryRecordEh; Command: TCustomSQLCommandEh; ResDataSet: TDataSet); virtual;
published
property Database: TIBDatabase read FDatabase write SetDatabase;
property SelectCommand;
property SelectSQL;
property UpdateCommand;
property UpdateSQL;
property InsertCommand;
property InsertSQL;
property DeleteCommand;
property DeleteSQL;
property GetrecCommand;
property GetrecSQL;
property ProviderDataSet;
property KeyFields;
property SpecParams: TStrings read FSpecParams write SetSpecParams;
property OnExecuteCommand;
property OnBuildDataStruct;
property OnGetBackUpdatedValues;
property OnProduceDataReader;
property OnAssignFieldValue;
property OnReadRecord;
property OnRefreshRecord;
property OnUpdateRecord;
property OnAssignCommandParam;
property OnUpdateError;
end;
implementation
{ TIBXCommandEh }
function TIBXCommandEh.Execute(var Cursor: TDataSet; var FreeOnEof: Boolean): Integer;
var
ACursor: TDataSet;
begin
Result := -1;
Cursor := nil;
FreeOnEof := False;
ACursor := nil;
try
case CommandType of
cthSelectQuery, cthUpdateQuery:
begin
ACursor := TIBQuery.Create(nil);
with ACursor as TIBQuery do
begin
Database := DataDriver.Database;
SQL := Self.CommandText;
Params := Self.Params;
if CommandType = cthSelectQuery then
Open
else
begin
ExecSQL;
Result := RowsAffected;
end;
Self.Params := Params;
end;
end;
cthTable:
begin
ACursor := TIBTable.Create(nil);
with ACursor as TIBTable do
begin
Database := DataDriver.Database;
TableName := Self.CommandText.Text;
Params := Self.Params;
Open;
Self.Params := Params;
end;
end;
cthStoredProc:
begin
ACursor := TIBStoredProc.Create(nil);
with ACursor as TIBStoredProc do
begin
Database := DataDriver.Database;
StoredProcName := Self.CommandText.Text;
Params := Self.Params;
ExecProc;
//?? Result := RowsAffected;
Self.Params := Params;
end;
end;
end;
if ACursor.Active then
begin
Cursor := ACursor;
FreeOnEof := True;
ACursor := nil;
end
finally
if ACursor <> nil then
ACursor.Free;
end;
end;
function TIBXCommandEh.GetDataDriver: TIBXDataDriverEh;
begin
Result := TIBXDataDriverEh(inherited DataDriver);
end;
{ TIBXDataDriverEh }
constructor TIBXDataDriverEh.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSpecParams := TStringList.Create;
end;
destructor TIBXDataDriverEh.Destroy;
begin
FSpecParams.Free;
inherited Destroy;
end;
function TIBXDataDriverEh.CreateDesignCopy: TCustomSQLDataDriverEh;
begin
Result := TIBXDataDriverEh.Create(nil);
Result.SelectCommand := SelectCommand;
Result.UpdateCommand := UpdateCommand;
Result.InsertCommand := InsertCommand;
Result.DeleteCommand := DeleteCommand;
Result.GetrecCommand := GetrecCommand;
// TIBXDataDriverEh(Result).DatabaseName :=
// (DesignDataBase as IIBXDesignDataBaseEh).GetDataBase.DatabaseName;
end;
function TIBXDataDriverEh.CreateDesignDataBase: IInterface;
{var
DesignDataBase: TIBXDesignDataBaseEh;
SourceDataBase: TDataBase;
Description: TDBDescription;}
begin
{ DesignDataBase := TIBXDesignDataBaseEh.Create;
SourceDataBase := Session.FindDatabase(DatabaseName);
if SourceDataBase <> nil then
begin
DesignDataBase.FDBEDataBase.DatabaseName := GetUnicalDataBaseName;
if (SourceDataBase.AliasName = '') and
(SourceDataBase.DriverName = '') and
GetDatabaseDesc(DatabaseName, Description)
then
DesignDataBase.FDBEDataBase.AliasName := DatabaseName
else if SourceDataBase.AliasName <> '' then
DesignDataBase.FDBEDataBase.AliasName := SourceDataBase.AliasName
else if SourceDataBase.DriverName <> '' then
DesignDataBase.FDBEDataBase.DriverName := SourceDataBase.DriverName;
DesignDataBase.FDBEDataBase.Params := SourceDataBase.Params;
end else if GetDatabaseDesc(DatabaseName, Description) then
DesignDataBase.FDBEDataBase.DatabaseName := DataBaseName;
Result := DesignDataBase;}
end;
function TIBXDataDriverEh.CreateInsertCommand: TCustomSQLCommandEh;
begin
Result := TIBXCommandEh.Create(Self);
end;
function TIBXDataDriverEh.CreateSelectCommand: TCustomSQLCommandEh;
begin
Result := TIBXCommandEh.Create(Self);
end;
function TIBXDataDriverEh.CreateGetrecCommand: TCustomSQLCommandEh;
begin
Result := TIBXCommandEh.Create(Self);
end;
function TIBXDataDriverEh.CreateUpdateCommand: TCustomSQLCommandEh;
begin
Result := TIBXCommandEh.Create(Self);
end;
function TIBXDataDriverEh.CreateDeleteCommand: TCustomSQLCommandEh;
begin
Result := TIBXCommandEh.Create(Self);
end;
procedure TIBXDataDriverEh.SetSpecParams(const Value: TStrings);
begin
FSpecParams.Assign(Value);
end;
procedure TIBXDataDriverEh.GetBackUpdatedValues(MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
begin
inherited GetBackUpdatedValues(MemRec, Command, ResDataSet);
DoServerSpecOperations(MemRec, Command, ResDataSet);
end;
//InterBase
procedure DoInterBaseServerSpecOperations(DataDriver: TIBXDataDriverEh; MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
const
SGENSQL = 'SELECT GEN_ID(%s, %d) FROM RDB$DATABASE'; {do not localize}
var
Generator, GeneratorField: String;
q: TIBQuery;
begin
{ TODO : May be better to use Memrec.UpdateStatus = Inserted ? }
if Command <> DataDriver.InsertCommand then Exit;
Generator := DataDriver.SpecParams.Values['GENERATOR'];
GeneratorField := DataDriver.SpecParams.Values['GENERATOR_FIELD'];
if MemRec.DataStruct.FindField(GeneratorField) = nil then
GeneratorField := '';
if (Generator <> '') and (GeneratorField <> '') then
begin
q := TIBQuery.Create(nil);
try
q.Database := DataDriver.Database;
q.SQL.Text := Format(SGENSQL, [Generator, 0]);
q.Open;
// Get current GENERATOR value
MemRec.DataValues[GeneratorField, dvvValueEh] := q.Fields[0].Value;
finally
q.Free;
end;
end;
end;
procedure TIBXDataDriverEh.DoServerSpecOperations(MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
begin
if (Database = nil) then
Exit;
DoInterBaseServerSpecOperations(Self, MemRec, Command, ResDataSet)
end;
procedure TIBXDataDriverEh.SetDatabase(const Value: TIBDatabase);
begin
FDatabase := Value;
end;
procedure TIBXDataDriverEh.SetAutoIncFields(Fields: TFields; DataStruct: TMTDataStructEh);
var
AutoIncFieldName: String;
AutoIncField: TMTDataFieldEh;
begin
AutoIncFieldName := SpecParams.Values['AUTO_INCREMENT_FIELD'];
AutoIncField := nil;
if AutoIncFieldName <> '' then
AutoIncField := DataStruct.FindField(AutoIncFieldName);
if (AutoIncField <> nil) and (AutoIncField is TMTNumericDataFieldEh) then
TMTNumericDataFieldEh(AutoIncField).NumericDataType := fdtAutoIncEh;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -