📄 sqlexpr.pas
字号:
FLastError: string; // DBExpress GetError() clears error; need to save last
FMaxBlobSize: Integer;
FMaxColSize: LongWord;
FNativeCommand: string;
FNoMetadata: Boolean deprecated;
FGetMetadata: Boolean;
FNumericMapping: Boolean;
FParamCheck: Boolean;
FParamCount: Integer;
FParams: TParams;
FPrepared: Boolean;
FProcParams: TList;
FRecords: Integer;
FRowsAffected: Integer;
FSchemaInfo: TSQLSchemaInfo;
FSortFieldNames: string;
FSQLCommand: ISQLCommand;
FSQLConnection: TSQLConnection;
FSQLCursor: ISQLCursor;
FStatementOpen: Boolean;
FTransactionLevel: SmallInt;
FSchemaName: string;
function CheckFieldNames(const FieldNames: string): Boolean;
procedure CheckConnection(eFlag: eConnectFlag);
function CheckDetail(const SQL: string): string;
procedure CheckStatement(ForSchema: Boolean = False);
function GetCalculatedField(Field: TField; var Buffer: Pointer): Boolean;
function GetDataSetFromSQL(TableName: string): TCustomSQLDataSet;
function GetProcParams: TList;
function GetInternalConnection: TSQLConnection;
function GetObjectProcParamCount: Integer; virtual;
function GetParamCount: Integer; virtual;
function GetQueryFromType: string; virtual;
function GetRowsAffected: Integer;
procedure InitBuffers;
procedure LoadFieldDef(FieldID: Word; var FldDesc: FLDDesc);
procedure ReadDesignerData(Reader: TReader);
procedure RefreshParams;
procedure SetConnection(const Value: TSQLConnection); virtual;
procedure SetCurrentBlobSize(Value: LongWord);
procedure SetDataSource(Value: TDataSource);
procedure SetParameters(const Value: TParams);
procedure SetParamsFromProcedure;
procedure SetParamsFromSQL(DataSet: TDataSet; bFromFields: Boolean);
procedure SetPrepared(Value: Boolean);
procedure SetCommandType(const Value: TSQLCommandType); virtual;
procedure WriteDesignerData(Writer: TWriter);
procedure SetSchemaName(const Value: string);
procedure SetSchemaOption;
protected
{ IProviderSupport }
procedure PSEndTransaction(Commit: Boolean); override;
procedure PSExecute; override;
function PSExecuteStatement(const ASQL: string; AParams: TParams;
ResultSet: Pointer = nil): Integer; override;
procedure PSGetAttributes(List: TList); override;
function PSGetDefaultOrder: TIndexDef; override;
function PSGetKeyFields: string; override;
function PSGetIndexDefs(IndexTypes: TIndexOptions): TIndexDefs; override;
function PSGetParams: TParams; override;
function PSGetQuoteChar: string; override;
function PSGetTableName: string; override;
function PSGetUpdateException(E: Exception; Prev: EUpdateError): EUpdateError; override;
function PSInTransaction: Boolean; override;
function PSIsSQLBased: Boolean; override;
function PSIsSQLSupported: Boolean; override;
procedure PSReset; override;
procedure PSSetCommandText(const ACommandText: string); override;
procedure PSSetParams(AParams: TParams); override;
procedure PSStartTransaction; override;
function PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean; override;
protected
{ implementation of abstract TDataSet methods }
procedure InternalClose; override;
procedure InternalHandleException; override;
procedure InternalInitFieldDefs; override;
procedure InternalOpen; override;
function IsCursorOpen: Boolean; override;
protected
procedure AddFieldDesc(FieldDescs: TFieldDescList; DescNo: Integer;
var FieldID: Integer; RequiredFields: TBits; FieldDefs: TFieldDefs);
procedure AddIndexDefs(SourceDS: TCustomSQLDataSet; IndexName: string = '') ;
function Check(status: SQLResult): SQLResult;
procedure CheckPrepareError;
procedure ClearIndexDefs;
procedure CloseCursor; override;
procedure CloseStatement;
procedure DefineProperties(Filer: TFiler); override;
function ExecSQL(ExecDirect: Boolean = False): Integer; virtual;
procedure ExecuteStatement;
procedure FreeCursor;
procedure FreeBuffers;
procedure FreeStatement;
function GetCanModify: Boolean; override;
function GetDataSource: TDataSource; override;
procedure GetObjectTypeNames(Fields: TFields);
procedure GetOutputParams(AProcParams: TList);
function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; override;
function GetSortFieldNames: string;
procedure InitRecord(Buffer: PChar); override;
procedure InternalRefresh; override;
procedure Loaded; override;
function LocateRecord(const KeyFields: string; const KeyValues: Variant;
Options: TLocateOptions; SyncCursor: Boolean): Boolean;
procedure OpenCursor(InfoQuery: Boolean); override;
procedure OpenSchema; virtual;
procedure PrepareStatement; virtual;
procedure PropertyChanged;
procedure SetBufListSize(Value: Integer); override;
procedure SetCommandText(const Value: string); virtual;
procedure SetFieldData(Field: TField; Buffer: Pointer); override;
procedure SetParamsFromCursor;
procedure SetSortFieldNames(Value: string);
procedure SQLError(OpStatus: SQLResult; eType: TSQLExceptionType);
procedure UpdateIndexDefs; override;
{ protected properties }
property BlobBuffer: TBlobByteData read FBlobBuffer write FBlobBuffer;
property CurrentBlobSize: LongWord read FCurrentBlobSize write SetCurrentBlobSize;
property DataLink: TDataLink read FDataLink;
property InternalConnection: TSqlConnection read GetInternalConnection;
property LastError: string read FLastError write FLastError;
property NativeCommand: string read FNativeCommand write FNativeCommand;
property ProcParams: TList read GetProcParams write FProcParams;
property RowsAffected: Integer read GetRowsAffected;
procedure SetMaxBlobSize(MaxSize: Integer);
procedure SetFCommandText(const Value: string);
property ParamCount: Integer read GetParamCount;
property SchemaInfo: TSQLSchemaInfo read FSchemaInfo write FSchemaInfo;
protected { publish in TSQLDataSet }
property CommandText: string read FCommandText write SetCommandText;
property CommandType: TSQLCommandType read FCommandType write SetCommandType default ctQuery;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property MaxBlobSize: Integer read FMaxBlobSize write SetMaxBlobSize default 0;
function GetRecordCount: Integer; override;
property Params: TParams read FParams write SetParameters;
property ParamCheck: Boolean read FParamCheck write FParamCheck default True;
property SortFieldNames: string read GetSortFieldNames write SetSortFieldNames;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
function GetBlobFieldData(FieldNo: Integer; var Buffer: TBlobByteData): Integer; override;
procedure GetDetailLinkFields(MasterFields, DetailFields: TList); override;
function GetFieldData(FieldNo: Integer; Buffer: Pointer): Boolean; overload; override;
function GetFieldData(Field: TField; Buffer: Pointer): Boolean; overload; override;
function GetKeyFieldNames(List: TStrings): Integer;
function GetQuoteChar: string; virtual;
function ParamByName(const Value: string): TParam;
property IndexDefs: TIndexDefs read FIndexDefs write FIndexDefs;
function IsSequenced: Boolean; 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;
procedure SetSchemaInfo(SchemaType: TSchemaType; SchemaObjectName, SchemaPattern: string; PackageName: string = '');
property Prepared: Boolean read FPrepared write SetPrepared default False;
property DesignerData: string read FDesignerData write FDesignerData;
property RecordCount: Integer read GetRecordCount;
property SQLConnection: TSQLConnection read FSQLConnection write SetConnection;
property TransactionLevel: SmallInt read FTransactionLevel write FTransactionLevel default 0;
published
property SchemaName: string read FSchemaName write SetSchemaName;
property NoMetadata: Boolean read FNoMetadata write FNoMetadata default False;
property GetMetadata: Boolean read FGetMetadata write FGetMetadata default True;
property NumericMapping: Boolean read FNumericMapping write FNumericMapping default False;
property ObjectView default False;
property BeforeOpen;
property AfterOpen;
property BeforeClose;
property AfterClose;
property BeforeScroll;
property AfterScroll;
property BeforeRefresh;
property AfterRefresh;
property OnCalcFields;
property Active default False;
end;
{ TSQLDataSet }
TSQLDataSet = class(TCustomSQLDataSet)
public
constructor Create(AOwner: TComponent); override;
function ExecSQL(ExecDirect: Boolean = False): Integer; override;
published
property CommandText;
property CommandType;
property DataSource;
property MaxBlobSize;
property ParamCheck;
property Params;
property SortFieldNames;
property SQLConnection;
end;
{ TSQLQuery }
TSQLQuery = class(TCustomSQLDataSet)
private
FSQL: TStrings;
FText: string;
procedure QueryChanged(Sender: TObject);
procedure SetSQL(Value: TStrings);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function ExecSQL(ExecDirect: Boolean = False): Integer; override;
procedure PrepareStatement; override;
property RowsAffected;
property Text: string read FText;
published
property DataSource;
property GetMetadata default False;
property MaxBlobSize;
property NoMetaData default True;
property ParamCheck;
property Params;
property SQL: TStrings read FSQL write SetSQL;
property SQLConnection;
end;
{ TSQLStoredProc }
TSQLStoredProc = class(TCustomSQLDataSet)
private
FStoredProcName: string;
FPackageName: string;
procedure SetStoredProcName(Value: string);
procedure SetPackageName(Value: string);
public
constructor Create(AOwner: TComponent); override;
function ExecProc: Integer; virtual;
function NextRecordSet: TCustomSQLDataSet;
procedure PrepareStatement; override;
published
property MaxBlobSize;
property ParamCheck;
property Params;
{ SetPackageName set StoredProcName to empty string
Need to set PackageName 1st, and StoredProcName 2nd.
Don't change following 2 items order }
property PackageName: string read FPackageName write SetPackageName;
property SQLConnection;
property StoredProcName: string read FStoredProcName write SetStoredProcName;
end;
{ TSQLTable }
TSQLTable = class(TCustomSQLDataSet)
private
FIsDetail: Boolean;
FIndexFields: TList;
FIndexFieldNames: string;
FIndexName: string;
FMasterLink: TMasterDataLink;
FTableName: string;
FIndexFieldCount: Integer;
procedure AddParamsToQuery;
function GetMasterFields: string;
function GetIndexField(Index: Integer): TField;
function GetIndexFieldCount: Integer;
function RefreshIndexFields: Integer;
procedure SetIndexFieldNames(Value: string);
procedure SetIndexName(Value: string);
procedure SetMasterFields(Value: string);
procedure SetTableName(Value: string);
function GetQueryFromType: string; override;
procedure SetDataSource(Value: TDataSource);
protected
procedure OpenCursor(InfoQuery: Boolean); override;
procedure SetIndexField(Index: Integer; Value: TField);
property MasterLink: TMasterDataLink read FMasterLink;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DeleteRecords;
procedure GetIndexNames(List: TStrings);
procedure PrepareStatement; override;
property IndexFields[Index: Integer]: TField read GetIndexField write SetIndexField;
property IndexFieldCount: Integer read GetIndexFieldCount;
published
property Active default False;
property IndexFieldNames: string read FIndexFieldNames write SetIndexFieldNames;
property IndexName: string read FIndexName write SetIndexName;
property MasterFields: string read GetMasterFields write SetMasterFields;
property MasterSource: TDataSource read GetDataSource write SetDataSource;
property MaxBlobSize;
property SQLConnection;
property TableName: string read FTableName write SetTableName;
end;
{ Utility Routines }
procedure LoadParamListItems(Params: TParams; ProcParams: TList);
procedure FreeProcParams(var ProcParams: TList);
procedure GetConnectionNames(List: TStrings; Driver: string = ''; DesignMode: Boolean = True);
procedure GetDriverNames(List: TStrings; DesignMode: Boolean = True);
function GetDriverRegistryFile(DesignMode: Boolean = False): string;
function GetConnectionRegistryFile(DesignMode: Boolean = False): string;
var
{$IFDEF MSWINDOWS}
DllGetClassObject: function(const CLSID, IID: TGUID; var Obj): HResult; stdcall;
procedure RegisterDbXpressLib(GetClassProc: Pointer);
{$ENDIF}
threadvar
GetDriver: function(SVendorLib, SResourceFile: PChar; out Obj): SQLResult; stdcall;
DllHandle: THandle;
implementation
{$IFDEF MSWINDOWS}
uses Registry, SqlConst, DBConsts, IniFiles, DBConnAdmin, Math, FMTBcd;
{$ENDIF}
{$IFDEF LINUX}
uses SqlConst, DBConsts, IniFiles, Math, DBConnAdmin, FMTBcd;
{$ENDIF}
{ Utility routines }
procedure CheckObject(const Value: IInterface; const eType: TSQLExceptionType);
var
Message: string;
begin
if not Assigned(Value) then
begin
case eType of
exceptConnection: Message := SDBXNOCONNECTION;
exceptCommand: Message := SDBXNOCOMMAND;
exceptCursor: Message := SDBXNOCURSOR;
exceptMetadata: Message := SDBXNOMETAOBJECT;
end;
DatabaseError(Message);
end;
end;
function AddQuoteCharToObjectName(DS : TCustomSQLDataSet; Name, Q: string): string;
var
Status: SQLResult;
P: PChar;
Len : smallint;
buf : array [0..255] of char;
begin
Result := '';
FillChar(buf, SizeOf(buf), #0);
P := PChar(Name);
Status := DS.GetInternalConnection.FISQLConnection.setOption(eConnQualifiedName, LongInt(P));
if Status <> 0 then
DS.SQLError(Status, exceptConnection);
Status := DS.GetInternalConnection.FISQLConnection.getOption(eConnQuotedObjectName, @buf, SizeOf(buf), Len);
if Status <> 0 then
DS.SQLError(Status, exceptConnection);
Result := buf;
end;
function GetTableScope(Scope: TTableScopes): LongWord;
begin
Result := 0;
if tsTable in Scope then
Result := Result OR eSQLTable;
if tsView in Scope then
Result := Result OR eSQLView;
if tsSysTable in Scope then
Result := Result OR eSQLSystemTable;
if tsSynonym in Scope then
Result := Result OR eSQLSynonym;
end;
{$IFDEF LINUX}
function CopyConfFile(Source, Target: string): Boolean;
var
List: TStrings;
IniIn, IniOut: TMemIniFile;
begin
List := TStringList.Create;
try
IniIn := TMemIniFile.Create(Source);
try
IniOut := TMemIniFile.Create(Target);
try
IniIn.GetStrings(List);
IniOut.SetStrings(List);
IniOut.UpdateFile;
Result := True;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -