📄 bdedatadrivereh.pas
字号:
{$ENDIF}
Description.szName := Desc.szName;
Description.szText := Desc.szText;
Description.szPhyName := Desc.szPhyName;
Description.szDbType := Desc.szDbType;
Result := True;
end;
function TBDEDataDriverEh.CreateDesignDataBase: IInterface;
{var
DesignDataBase: TBDEDesignDataBaseEh;
SourceDataBase: TDataBase;
Description: TDBDescription;}
begin
{ DesignDataBase := TBDEDesignDataBaseEh.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 TBDEDataDriverEh.CreateInsertCommand: TCustomSQLCommandEh;
begin
Result := TBDECommandEh.Create(Self);
end;
function TBDEDataDriverEh.CreateSelectCommand: TCustomSQLCommandEh;
begin
Result := TBDECommandEh.Create(Self);
end;
function TBDEDataDriverEh.CreateGetrecCommand: TCustomSQLCommandEh;
begin
Result := TBDECommandEh.Create(Self);
end;
function TBDEDataDriverEh.CreateUpdateCommand: TCustomSQLCommandEh;
begin
Result := TBDECommandEh.Create(Self);
end;
function TBDEDataDriverEh.CreateDeleteCommand: TCustomSQLCommandEh;
begin
Result := TBDECommandEh.Create(Self);
end;
procedure TBDEDataDriverEh.SetDatabaseName(const Value: string);
begin
FDatabaseName := Value;
end;
procedure TBDEDataDriverEh.SetSpecParams(const Value: TStrings);
begin
FSpecParams.Assign(Value);
end;
procedure TBDEDataDriverEh.GetBackUpdatedValues(MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
begin
inherited GetBackUpdatedValues(MemRec, Command, ResDataSet);
DoServerSpecOperations(MemRec, Command, ResDataSet);
end;
//Informix
procedure DoInformixServerSpecOperations(DataDriver: TBDEDataDriverEh; MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
type
TSQLCA = packed record
sqlcode: Longint;
sqlerrm: array [0..71] of char; // error message parameters
sqlerrp: array [0..7] of char;
sqlerrd: array [0..5] of Longint;
// 0 - estimated number of rows returned
// 1 - serial value after insert or ISAM error code
// 2 - number of rows processed
// 3 - estimated cost
// 4 - offset of the error into the SQL statement
// 5 - rowid after insert
sqlwarn: array [0..7] of char;
// = W if any of sqlwarn[1-7]
// = W if any truncation occurred or database has transactions
// = W if a null value returned or ANSI database
// = W if no. in select list != no. in into list or turbo backend
// = W if no where clause on prepared update, delete or incompatible float format
// = W if non-ANSI statement
// reserved
// reserved
end;
var
sqlca: TSQLCA;
res: Word;
SerrialField: String;
begin
if Command <> DataDriver.InsertCommand then Exit;
sqlca.sqlerrd[1] := 0;
{$IFDEF CIL}
{ TODO : DbiGetProp }
{$ELSE}
if (ResDataSet is TDBDataSet) and (TDBDataSet(ResDataSet).Database <> nil) then
Check(DbiGetProp(hDBIObj(TDBDataSet(ResDataSet).Database.Handle), drvNATIVESQLCA, @sqlca, SizeOf(tsqlca), res));
{$ENDIF}
SerrialField := DataDriver.SpecParams.Values['SERIAL_FIELD'];
if MemRec.DataStruct.FindField(SerrialField) = nil then
SerrialField := '';
{??? InsertCommand = Command}
if (DataDriver.InsertCommand = Command) and (SerrialField <> '') then
begin
if sqlca.sqlerrd[1] > 0 then
begin
MemRec.DataValues[SerrialField, dvvValueEh] := sqlca.sqlerrd[1];
end;
end;
end;
//DB2
procedure DoDB2ServerSpecOperations(DataDriver: TBDEDataDriverEh; MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
begin
end;
//InterBase
procedure DoInterBaseServerSpecOperations(DataDriver: TBDEDataDriverEh; MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
const
SGENSQL = 'SELECT GEN_ID(%s, %d) FROM RDB$DATABASE'; {do not localize}
var
Generator, GeneratorField: String;
q: TQuery;
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 := TQuery.Create(nil);
try
q.DatabaseName := DataDriver.DatabaseName;
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;
//Oracle
procedure DoOracleServerSpecOperations(DataDriver: TBDEDataDriverEh; MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
const
SEQSQL = 'SELECT %s.curval FROM dual'; {do not localize}
var
Sequence, SequenceField: String;
q: TQuery;
begin
if Command <> DataDriver.InsertCommand then Exit;
Sequence := DataDriver.SpecParams.Values['SEQUENCE'];
SequenceField := DataDriver.SpecParams.Values['SEQUENCE_FIELD'];
if MemRec.DataStruct.FindField(SequenceField) = nil then
SequenceField := '';
if (Sequence <> '') and (SequenceField <> '') and
(ResDataSet is TDBDataSet) and (TDBDataSet(ResDataSet).Database <> nil) then
begin
q := TQuery.Create(nil);
try
q.DatabaseName := TDBDataSet(ResDataSet).DatabaseName;
q.SQL.Text := Format(SEQSQL, [Sequence, 0]);
q.Open;
// Get current Sequence value
MemRec.DataValues[SequenceField, dvvValueEh] := q.Fields[0].Value;
finally
q.Free;
end;
end;
end;
//Sybase
procedure DoSybaseServerSpecOperations(DataDriver: TBDEDataDriverEh; MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
begin
end;
procedure TBDEDataDriverEh.DoServerSpecOperations(MemRec: TMemoryRecordEh;
Command: TCustomSQLCommandEh; ResDataSet: TDataSet);
var
Description: TDBDescription;
begin
if not GetDatabaseDesc(DatabaseName, Description) then
Exit;
if Description.szDbType = 'INFROMIX' then
DoInformixServerSpecOperations(Self, MemRec, Command, ResDataSet)
else if Description.szDbType = 'DB2' then
DoDB2ServerSpecOperations(Self, MemRec, Command, ResDataSet)
else if Description.szDbType = 'INTRBASE' then
DoInterBaseServerSpecOperations(Self, MemRec, Command, ResDataSet)
else if Description.szDbType = 'ORACLE' then
DoOracleServerSpecOperations(Self, MemRec, Command, ResDataSet)
else if Description.szDbType = 'SYBASE' then
DoSybaseServerSpecOperations(Self, MemRec, Command, ResDataSet);
end;
function TBDEDataDriverEh.GetDBSession: TSession;
begin
Result := Sessions.FindSession(SessionName);
if Result = nil then Result := DBTables.Session;
end;
procedure TBDEDataDriverEh.SetSessionName(const Value: string);
begin
FSessionName := Value;
end;
procedure TBDEDataDriverEh.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 + -