📄 dbclient.pas
字号:
procedure DoBeforeExecute(var OwnerData: OleVariant); virtual;
procedure DoExecute(Params: OleVariant); virtual;
{ DataSet methods }
procedure ResetAggField(Field: TField); override;
procedure ActivateFilters;
procedure AddDataPacket(const Data: OleVariant; HitEOF: Boolean); virtual;
procedure AddFieldDesc(FieldDescs: TFieldDescList; var DescNo: Integer;
var FieldID: Integer; FieldDefs: TFieldDefs);
procedure AllocKeyBuffers;
function AllocRecordBuffer: PChar; override;
procedure Check(Status: DBResult);
procedure CheckDetailRecords; virtual;
procedure CheckSetKeyMode;
procedure ClearCalcFields(Buffer: PChar); override;
procedure CloseCursor; override;
procedure DataConvert(Field: TField; Source, Dest: Pointer; ToNative: Boolean); override;
procedure DataEvent(Event: TDataEvent; Info: Longint); override;
procedure DeactivateFilters;
procedure DefChanged(Sender: TObject); override;
procedure DefineProperties(Filer: TFiler); override;
procedure DestroyLookupCursor; virtual;
procedure DoBeforeInsert; override;
procedure DoOnNewRecord; override;
function FindRecord(Restart, GoForward: Boolean): Boolean; override;
procedure FreeKeyBuffers;
procedure FreeRecordBuffer(var Buffer: PChar); override;
function GetAggregateValue(Field: TField): Variant; override;
function GetAppServer: IAppServer; virtual;
procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
function GetCanModify: Boolean; override;
function GetDataSource: TDataSource; override;
function GetIndexField(Index: Integer): TField;
function GetIndexFieldCount: Integer;
function GetIsIndexField(Field: TField): Boolean; override;
function GetKeyBuffer(KeyIndex: TKeyIndex): PKeyBuffer;
function GetKeyExclusive: Boolean;
function GetKeyFieldCount: Integer;
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetRecordCount: Integer; override;
function GetRecNo: Integer; override;
function GetRecordSize: Word; override;
function GetRemoteServer: TCustomRemoteServer; virtual;
function GetStateFieldValue(State: TDataSetState; Field: TField): Variant; override;
function InitKeyBuffer(Buffer: PKeyBuffer): PKeyBuffer;
procedure InitRecord(Buffer: PChar); override;
procedure InternalAddRecord(Buffer: Pointer; Append: Boolean); override;
procedure InternalCancel; override;
procedure InternalClose; override;
procedure InternalDelete; override;
procedure InternalEdit; override;
procedure InternalFirst; override;
function InternalGetOptionalParam(const ParamName: string;
FieldNo: Integer = 0): OleVariant;
procedure InternalGotoBookmark(Bookmark: TBookmark); override;
procedure InternalHandleException; override;
procedure InternalInitFieldDefs; override;
procedure InternalInitRecord(Buffer: PChar); override;
procedure InternalInsert; override;
procedure InternalLast; override;
procedure InternalOpen; override;
procedure InternalRefresh; override;
procedure InternalPost; override;
procedure InternalSetToRecord(Buffer: PChar); override;
function IsCursorOpen: Boolean; override;
procedure Loaded; override;
function LocateRecord(const KeyFields: string; const KeyValues: Variant;
Options: TLocateOptions; SyncCursor: Boolean): Boolean;
procedure OpenCursor(InfoQuery: Boolean); override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure PostKeyBuffer(Commit: Boolean);
procedure RefreshInternalCalcFields(Buffer: PChar); override;
procedure ReadDataPacket(Stream: TStream; ReadSize: Boolean);
function ResetCursorRange: Boolean;
procedure SetAggregates(Value: TAggregates); virtual;
procedure SetAppServer(Value: IAppServer); virtual;
procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
procedure SetCommandText(Value: String); virtual;
function SetCursorRange: Boolean;
procedure SetDataSetField(const Value: TDataSetField); override;
procedure SetFieldData(Field: TField; Buffer: Pointer); override;
procedure SetFilterData(const Text: string; Options: TFilterOptions);
procedure SetFiltered(Value: Boolean); override;
procedure SetFilterOptions(Value: TFilterOptions); override;
procedure SetFilterText(const Value: string); override;
procedure SetIndexField(Index: Integer; Value: TField);
procedure SetKeyBuffer(KeyIndex: TKeyIndex; Clear: Boolean);
procedure SetKeyExclusive(Value: Boolean);
procedure SetKeyFieldCount(Value: Integer);
procedure SetKeyFields(KeyIndex: TKeyIndex; const Values: array of const);
procedure SetLinkRanges(MasterFields: TList);
procedure SetOnFilterRecord(const Value: TFilterRecordEvent); override;
procedure SetRecNo(Value: Integer); override;
procedure SetRemoteServer(Value: TCustomRemoteServer); virtual;
procedure SwitchToIndex(const IndexName: string);
procedure SyncCursors(Cursor1, Cursor2: IDSCursor);
procedure UpdateIndexDefs; override;
procedure WriteDataPacket(Stream: TStream; WriteSize: Boolean;
Format: TDataPacketFormat = dfBinary);
function ConstraintsStored: Boolean;
property Active;
property Aggregates: TAggregates read FAggregates write SetAggregates;
property AggregatesActive: Boolean read FAggregatesActive write SetAggsActive default False;
property AutoCalcFields;
property CommandText: string read FCommandText write SetCommandText;
property ConnectionBroker: TConnectionBroker read FConnectionBroker write SetConnectionBroker;
property Constraints stored ConstraintsStored;
property DataSetField;
property DisableStringTrim: Boolean read FDisableStringTrim write SetDisableStringTrim default False;
property DSBase: IDSBase read FDSBase write FDSBase;
property DSCursor: IDSCursor read FDSCursor;
property FileName: string read FFileName write SetFileName;
property Filter;
property Filtered;
property FilterOptions;
property FieldDefs stored FStoreDefs;
property IndexDefs: TIndexDefs read GetIndexDefs write SetIndexDefs stored FStoreDefs;
property IndexFieldNames: string read GetIndexFieldNames write SetIndexFieldNames;
property IndexName: string read GetIndexName write SetIndexName;
property FetchOnDemand: Boolean read FFetchOnDemand write FFetchOnDemand default True;
property MasterFields: string read GetMasterFields write SetMasterFields;
property MasterSource: TDataSource read GetDataSource write SetDataSource;
property ObjectView default True;
property PacketRecords: Integer read FPacketRecords write FPacketRecords default -1;
property Params: TParams read FParams write SetParams;
property ProviderEOF: Boolean read GetProviderEOF write SetProviderEOF;
property ProviderName: string read FProviderName write SetProviderName;
property ReadOnly: Boolean read FReadOnly write SetReadOnly default False;
property RemoteServer: TCustomRemoteServer read GetRemoteServer write SetRemoteServer;
property StoreDefs: Boolean read FStoreDefs write FStoreDefs default False;
property BeforeOpen;
property AfterOpen;
property BeforeClose;
property AfterClose;
property BeforeInsert;
property AfterInsert;
property BeforeEdit;
property AfterEdit;
property BeforePost;
property AfterPost;
property BeforeCancel;
property AfterCancel;
property BeforeDelete;
property AfterDelete;
property BeforeScroll;
property AfterScroll;
property BeforeRefresh;
property AfterRefresh;
property OnCalcFields;
property OnDeleteError;
property OnEditError;
property OnFilterRecord;
property OnNewRecord;
property OnPostError;
property OnReconcileError: TReconcileErrorEvent read FOnReconcileError write FOnReconcileError;
property BeforeApplyUpdates: TRemoteEvent read FBeforeApplyUpdates write FBeforeApplyUpdates;
property AfterApplyUpdates: TRemoteEvent read FAfterApplyUpdates write FAfterApplyUpdates;
property BeforeGetRecords: TRemoteEvent read FBeforeGetRecords write FBeforeGetRecords;
property AfterGetRecords: TRemoteEvent read FAfterGetRecords write FAfterGetRecords;
property BeforeRowRequest: TRemoteEvent read FBeforeRowRequest write FBeforeRowRequest;
property AfterRowRequest: TRemoteEvent read FAfterRowRequest write FAfterRowRequest;
property BeforeExecute: TRemoteEvent read FBeforeExecute write FBeforeExecute;
property AfterExecute: TRemoteEvent read FAfterExecute write FAfterExecute;
property BeforeGetParams: TRemoteEvent read FBeforeGetParams write FBeforeGetParams;
property AfterGetParams: TRemoteEvent read FAfterGetParams write FAfterGetParams;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure AddIndex(const Name, Fields: string; Options: TIndexOptions;
const DescFields: string = ''; const CaseInsFields: string = '';
const GroupingLevel: Integer = 0);
procedure AppendData(const Data: OleVariant; HitEOF: Boolean);
procedure ApplyRange;
function ApplyUpdates(MaxErrors: Integer): Integer; virtual;
function BookmarkValid(Bookmark: TBookmark): Boolean; override;
procedure Cancel; override;
procedure CancelRange;
procedure CancelUpdates;
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
procedure CreateDataSet;
procedure CloneCursor(Source: TCustomClientDataSet; Reset: Boolean;
KeepSettings: Boolean = False); virtual;
function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;
function ConstraintsDisabled: Boolean;
function DataRequest(Data: OleVariant): OleVariant; virtual;
procedure DeleteIndex(const Name: string);
procedure DisableConstraints;
procedure EnableConstraints;
procedure EditKey;
procedure EditRangeEnd;
procedure EditRangeStart;
procedure EmptyDataSet;
procedure Execute; virtual;
procedure FetchBlobs;
procedure FetchDetails;
procedure RefreshRecord;
procedure FetchParams;
function FindKey(const KeyValues: array of const): Boolean; virtual;
procedure FindNearest(const KeyValues: array of const);
function GetCurrentRecord(Buffer: PChar): Boolean; override;
function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: Pointer): Boolean; overload; override;
function GetGroupState(Level: Integer): TGroupPosInds;
procedure GetIndexInfo(IndexName: string);
procedure GetIndexNames(List: TStrings);
function GetNextPacket: Integer;
function GetOptionalParam(const ParamName: string): OleVariant;
procedure GotoCurrent(DataSet: TCustomClientDataSet);
function GotoKey: Boolean;
procedure GotoNearest;
property HasAppServer: Boolean read GetHasAppServer;
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;
procedure LoadFromFile(const FileName: string = '');
procedure LoadFromStream(Stream: TStream);
procedure MergeChangeLog;
procedure Post; override;
function Reconcile(const Results: OleVariant): Boolean;
procedure RevertRecord;
procedure SaveToFile(const FileName: string = ''; Format: TDataPacketFormat = dfBinary);
procedure SaveToStream(Stream: TStream; Format: TDataPacketFormat = dfBinary);
procedure SetAltRecBuffers(Old, New, Cur: PChar);
procedure SetKey;
procedure SetOptionalParam(const ParamName: string; const Value: OleVariant;
IncludeInDelta: Boolean = False);
procedure SetProvider(Provider: TComponent);
procedure SetRange(const StartValues, EndValues: array of const);
procedure SetRangeEnd;
procedure SetRangeStart;
function UndoLastChange(FollowChange: Boolean): Boolean;
function UpdateStatus: TUpdateStatus; override;
property ActiveAggs[Index: Integer] : TList read GetActiveAggs;
property ChangeCount: Integer read GetChangeCount;
property CloneSource: TCustomClientDataSet read FCloneSource;
property Data: OleVariant read GetData write SetData;
property XMLData: string read GetXMLData write SetXMLData;
property AppServer: IAppServer read GetAppServer write SetAppServer;
property DataSize: Integer read GetDataSize;
property Delta: OleVariant read GetDelta;
property GroupingLevel: Integer read FGroupingLevel;
property IndexFieldCount: Integer read GetIndexFieldCount;
property IndexFields[Index: Integer]: TField read GetIndexField write SetIndexField;
property KeyExclusive: Boolean read GetKeyExclusive write SetKeyExclusive;
property KeyFieldCount: Integer read GetKeyFieldCount write SetKeyFieldCount;
property KeySize: Word read FKeySize;
property LogChanges: Boolean read GetLogChanges write SetLogChanges;
property SavePoint: Integer read GetSavePoint write SetSavePoint;
property StatusFilter: TUpdateStatusSet read FStatusFilter write SetStatusFilter;
end;
TClientDataSet = class(TCustomClientDataSet)
published
property Active;
property Aggregates;
property AggregatesActive;
property AutoCalcFields;
property CommandText;
property ConnectionBroker;
property Constraints;
property DataSetField;
property DisableStringTrim;
property FileName;
property Filter;
property Filtered;
property FilterOptions;
property FieldDefs;
property IndexDefs;
property IndexFieldNames;
property IndexName;
property FetchOnDemand;
property MasterFields;
property MasterSource;
property ObjectView;
property PacketRecords;
property Params;
property ProviderName;
property ReadOnly;
property RemoteServer;
property StoreDefs;
property BeforeOpen;
property AfterOpen;
property BeforeClose;
property AfterClose;
property BeforeInsert;
property AfterInsert;
property BeforeEdit;
property AfterEdit;
property BeforePost;
property AfterPost;
property BeforeCancel;
property AfterCancel;
property BeforeDelete;
property AfterDelete;
property BeforeScroll;
property AfterScroll;
property BeforeRefresh;
property AfterRefresh;
property OnCalcFields;
property OnDeleteError;
property OnEditError;
property OnFilterRecord;
property OnNewRecord;
property OnPostError;
property OnReconcileError;
property BeforeApplyUpdates;
property AfterApplyUpdates;
property BeforeGetRecords;
property AfterGetRecords;
property BeforeRowRequest;
property AfterRowRequest;
property BeforeExecute;
property AfterExecute;
property BeforeGetParams;
property AfterGetParams;
end;
{ TClientBlobStream }
TClientBlobStream = class(TMemoryStream)
private
FField: TBlobField;
FDataSet: TCustomClientDataSet;
FBuffer: PChar;
FFieldNo: Integer;
FModified: Boolean;
procedure ReadBlobData;
public
constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
destructor Destroy; override;
function Write(const Buffer; Count: Longint): Longint; override;
procedure Truncate;
end;
const
AllParamTypes = [ptUnknown, ptInput, ptOutput, ptInputOutput, ptResult];
function PackageParams(Params: TParams; Types: TParamTypes = AllParamTypes): OleVariant;
procedure UnpackParams(const Source: OleVariant; Dest: TParams);
const
AllRecords = -1;
implementation
{$IFDEF MSWINDOWS}
uses DBConsts, MidConst, Provider, TypInfo, ComObj, FMTBcd;
{$ENDIF}
{$IFDEF LINUX}
uses DBConsts, MidConst, Provider, TypInfo, FMTBcd, Types;
{$ENDIF}
{ Exceptions }
constructor EDBClient.Create(Message: string; ErrorCode: DBResult);
begin
FErrorCode := ErrorCode;
inherited Create(Message);
end;
constructor EReconcileError.Create(NativeError, Context: string;
ErrorCode, PreviousError: DBResult);
begin
FContext := Context;
FPreviousError := PreviousError;
inherited Create(NativeError, ErrorCode);
end;
{ Utility functions }
function PackageParams(Params: TParams; Types: TParamTypes = AllParamTypes): OleVariant;
var
I, Idx, Count: Integer;
begin
Result := NULL;
Count := 0;
for I := 0 to Params.Count - 1 do
if Params[I].ParamType in Types then Inc(Count);
if Count > 0 then
begin
Idx := 0;
Result := VarArrayCreate([0, Count - 1], varVariant);
for I := 0 to Params.Count - 1 do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -