📄 ibcustomdataset.pas
字号:
property BeforeDatabaseDisconnect: TNotifyEvent read FBeforeDatabaseDisconnect
write FBeforeDatabaseDisconnect;
property AfterDatabaseDisconnect: TNotifyEvent read FAfterDatabaseDisconnect
write FAfterDatabaseDisconnect;
property DatabaseFree: TNotifyEvent read FDatabaseFree
write FDatabaseFree;
property BeforeTransactionEnd: TNotifyEvent read FBeforeTransactionEnd
write FBeforeTransactionEnd;
property AfterTransactionEnd: TNotifyEvent read FAfterTransactionEnd
write FAfterTransactionEnd;
property TransactionFree: TNotifyEvent read FTransactionFree
write FTransactionFree;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ApplyUpdates;
function CachedUpdateStatus: TCachedUpdateStatus;
procedure CancelUpdates;
procedure FetchAll;
function LocateNext(const KeyFields: string; const KeyValues: Variant;
Options: TLocateOptions): Boolean;
procedure RecordModified(Value: Boolean);
procedure RevertRecord;
procedure Undelete;
procedure Post; override;
function Current : TIBXSQLDA;
function SQLType : TIBSQLTypes;
{ TDataSet support methods }
function BookmarkValid(Bookmark: TBookmark): Boolean; override;
function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
function GetCurrentRecord(Buffer: PChar): Boolean; override;
function GetFieldData(Field : TField; Buffer : Pointer) : Boolean; overload; override;
function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; overload; override;
function Locate(const KeyFields: string; const KeyValues: Variant;
Options: TLocateOptions): Boolean; override;
function Lookup(const KeyFields: string; const KeyValues: Variant;
const ResultFields: string): Variant; override;
function UpdateStatus: TUpdateStatus; override;
function IsSequenced: Boolean; override;
property DBHandle: PISC_DB_HANDLE read GetDBHandle;
property TRHandle: PISC_TR_HANDLE read GetTRHandle;
property UpdateObject: TIBDataSetUpdateObject read FUpdateObject write SetUpdateObject;
property UpdatesPending: Boolean read FUpdatesPending;
property UpdateRecordTypes: TIBUpdateRecordTypes read FUpdateRecordTypes
write SetUpdateRecordTypes;
property RowsAffected : Integer read FRowsAffected;
property Plan: String read GetPlan;
published
property Database: TIBDatabase read GetDatabase write SetDatabase;
property Transaction: TIBTransaction read GetTransaction
write SetTransaction;
property ForcedRefresh: Boolean read FForcedRefresh
write FForcedRefresh default False;
property AutoCalcFields;
property ObjectView default False;
property AfterCancel;
property AfterClose;
property AfterDelete;
property AfterEdit;
property AfterInsert;
property AfterOpen;
property AfterPost;
property AfterRefresh;
property AfterScroll;
property BeforeCancel;
property BeforeClose;
property BeforeDelete;
property BeforeEdit;
property BeforeInsert;
property BeforeOpen;
property BeforePost;
property BeforeRefresh;
property BeforeScroll;
property OnCalcFields;
property OnDeleteError;
property OnEditError;
property OnNewRecord;
property OnPostError;
property OnUpdateError: TIBUpdateErrorEvent read FOnUpdateError
write FOnUpdateError;
property OnUpdateRecord: TIBUpdateRecordEvent read FOnUpdateRecord
write FOnUpdateRecord;
end;
TIBDataSet = class(TIBCustomDataSet)
private
function GetPrepared: Boolean;
protected
procedure PSSetCommandText(const CommandText: string); override;
procedure SetFiltered(Value: Boolean); override;
procedure InternalOpen; override;
public
procedure Prepare;
procedure UnPrepare;
procedure BatchInput(InputObject: TIBBatchInput);
procedure BatchOutput(OutputObject: TIBBatchOutput);
procedure ExecSQL;
public
function ParamByName(Idx : String) : TIBXSQLVAR;
property Params;
property Prepared : Boolean read GetPrepared;
property StatementType;
property SelectStmtHandle;
property LiveMode;
published
{ TIBCustomDataSet }
property BufferChunks;
property CachedUpdates;
property DeleteSQL;
property InsertSQL;
property RefreshSQL;
property SelectSQL;
property ModifySQL;
property ParamCheck;
property UniDirectional;
property Filtered;
property GeneratorField;
property BeforeDatabaseDisconnect;
property AfterDatabaseDisconnect;
property DatabaseFree;
property BeforeTransactionEnd;
property AfterTransactionEnd;
property TransactionFree;
property UpdateObject;
{ TIBDataSet }
property Active;
property AutoCalcFields;
property DataSource read GetDataSource write SetDataSource;
property AfterCancel;
property AfterClose;
property AfterDelete;
property AfterEdit;
property AfterInsert;
property AfterOpen;
property AfterPost;
property AfterScroll;
property BeforeCancel;
property BeforeClose;
property BeforeDelete;
property BeforeEdit;
property BeforeInsert;
property BeforeOpen;
property BeforePost;
property BeforeScroll;
property OnCalcFields;
property OnDeleteError;
property OnEditError;
property OnFilterRecord;
property OnNewRecord;
property OnPostError;
end;
{ TIBDSBlobStream }
TIBDSBlobStream = class(TStream)
protected
FField: TField;
FBlobStream: TIBBlobStream;
FModified : Boolean;
public
constructor Create(AField: TField; ABlobStream: TIBBlobStream;
Mode: TBlobStreamMode);
destructor Destroy; override;
function Read(var Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
procedure SetSize(NewSize: Longint); override;
function Write(const Buffer; Count: Longint): Longint; override;
end;
const
DefaultFieldClasses: array[TFieldType] of TFieldClass = (
nil, { ftUnknown }
TIBStringField, { ftString }
TSmallintField, { ftSmallint }
TIntegerField, { ftInteger }
TWordField, { ftWord }
TBooleanField, { ftBoolean }
TFloatField, { ftFloat }
TCurrencyField, { ftCurrency }
TIBBCDField, { ftBCD }
TDateField, { ftDate }
TTimeField, { ftTime }
TDateTimeField, { ftDateTime }
TBytesField, { ftBytes }
TVarBytesField, { ftVarBytes }
TAutoIncField, { ftAutoInc }
TBlobField, { ftBlob }
TMemoField, { ftMemo }
TGraphicField, { ftGraphic }
TBlobField, { ftFmtMemo }
TBlobField, { ftParadoxOle }
TBlobField, { ftDBaseOle }
TBlobField, { ftTypedBinary }
nil, { ftCursor }
TStringField, { ftFixedChar }
nil, {TWideStringField } { ftWideString }
TLargeIntField, { ftLargeInt }
TADTField, { ftADT }
TArrayField, { ftArray }
TReferenceField, { ftReference }
TDataSetField, { ftDataSet }
TBlobField, { ftOraBlob }
TMemoField, { ftOraClob }
TVariantField, { ftVariant }
TInterfaceField, { ftInterface }
TIDispatchField, { ftIDispatch }
TGuidField, { ftGuid }
TSQLTimeStampField, { ftTimeStamp }
TFMTBcdField); { ftTimeStamp }
var
CreateProviderProc: function(DataSet: TIBCustomDataSet): IProviderSupport = nil;
implementation
uses IBIntf, FmtBcd;
{$IFDEF LINUX}
const
FILE_BEGIN = 0;
FILE_CURRENT = 1;
FILE_END = 2;
{$ENDIF}
{ TIBStringField}
constructor TIBStringField.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
class procedure TIBStringField.CheckTypeSize(Value: Integer);
begin
{ don't check string size. all sizes valid }
end;
function TIBStringField.GetAsString: string;
begin
if not GetValue(Result) then Result := '';
end;
function TIBStringField.GetAsVariant: Variant;
var
S: string;
begin
if GetValue(S) then Result := S else Result := Null;
end;
function TIBStringField.GetValue(var Value: string): Boolean;
var
Buffer: PChar;
begin
Buffer := nil;
IBAlloc(Buffer, 0, Size + 1);
try
Result := GetData(Buffer);
if Result then
begin
Value := string(Buffer);
if Transliterate and (Value <> '') then
DataSet.Translate(PChar(Value), PChar(Value), False);
end
finally
FreeMem(Buffer);
end;
end;
procedure TIBStringField.SetAsString(const Value: string);
var
Buffer: PChar;
begin
Buffer := nil;
IBAlloc(Buffer, 0, Size + 1);
try
StrLCopy(Buffer, PChar(Value), Size);
if Transliterate then
DataSet.Translate(Buffer, Buffer, True);
SetData(Buffer);
finally
FreeMem(Buffer);
end;
end;
{ TIBBCDField }
constructor TIBBCDField.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetDataType(ftBCD);
Size := 8;
end;
class procedure TIBBCDField.CheckTypeSize(Value: Integer);
begin
{ No need to check as the base type is currency, not BCD }
end;
function TIBBCDField.GetAsCurrency: Currency;
begin
if not GetValue(Result) then
Result := 0;
end;
function TIBBCDField.GetAsString: string;
var
C: System.Currency;
begin
if GetValue(C) then
Result := CurrToStr(C)
else
Result := '';
end;
function TIBBCDField.GetAsVariant: Variant;
var
C: System.Currency;
begin
if GetValue(C) then
Result := C
else
Result := Null;
end;
function TIBBCDField.GetDataSize: Integer;
begin
Result := 8;
end;
{ TIBDataLink }
constructor TIBDataLink.Create(ADataSet: TIBCustomDataSet);
begin
inherited Create;
FDataSet := ADataSet;
end;
destructor TIBDataLink.Destroy;
begin
FDataSet.FDataLink := nil;
inherited Destroy;
end;
procedure TIBDataLink.ActiveChanged;
begin
if FDataSet.Active then
FDataSet.RefreshParams;
end;
function TIBDataLink.GetDetailDataSet: TDataSet;
begin
Result := FDataSet;
end;
procedure TIBDataLink.RecordChanged(Field: TField);
begin
if (Field = nil) and FDataSet.Active then
FDataSet.RefreshParams;
end;
procedure TIBDataLink.CheckBrowseMode;
begin
if FDataSet.Active then
FDataSet.CheckBrowseMode;
end;
{ TIBCustomDataSet }
constructor TIBCustomDataSet.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FIBLoaded := False;
CheckIBLoaded;
FIBLoaded := True;
FBase := TIBBase.Create(Self);
FCurrentRecord := -1;
FDeletedRecords := 0;
FUniDirectional := False;
FBufferChunks := BufferCacheSize;
FBlobStreamList := TList.Create;
FDataLink := TIBDataLink.Create(Self);
FQDelete := TIBSQL.Create(Self);
FQDelete.OnSQLChanging := SQLChanging;
FQDelete.GoToFirstRecordOnExecute := False;
FQInsert := TIBSQL.Create(Self);
FQInsert.OnSQLChanging := SQLChanging;
FQInsert.GoToFirstRecordOnExecute := False;
FQRefresh := TIBSQL.Create(Self);
FQRefresh.OnSQLChanging := SQLChanging;
FQRefresh.GoToFirstRecordOnExecute := False;
FQSelect := TIBSQL.Create(Self);
FQSelect.OnSQLChanging := SQLChanging;
FQSelect.GoToFirstRecordOnExecute := False;
FQModify := TIBSQL.Create(Self);
FQModify.OnSQLChanging := SQLChanging;
FQModify.GoToFirstRecordOnExecute := False;
FUpdateRecordTypes := [cusUnmodified, cusModified, cusInserted];
FParamCheck := True;
FForcedRefresh := False;
FGeneratorField := TIBGeneratorField.Create(Self);
{Bookmark Size is Integer for IBX}
BookmarkSize := SizeOf(Integer);
FBase.BeforeDatabaseDisconnect := DoBeforeDatabaseDisconnect;
FBase.AfterDatabaseDisconnect := DoAfterDatabaseDisconnect;
FBase.OnDatabaseFree := DoDatabaseFree;
FBase.BeforeTransactionEnd := DoBeforeTransactionEnd;
FBase.AfterTransactionEnd := DoAfterTransactionEnd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -