📄 datadrivereh.pas
字号:
Bookmark := ProviderDataSet.Bookmark;
try
if MemRecord.UpdateStatus = usModified
then vValues := MemRecord.DataValues[KeyFields, dvvOldValueEh]
else vValues := MemRecord.DataValues[KeyFields, dvvValueEh];
KeyFound := ProviderDataSet.Locate(KeyFields, vValues, []);
if KeyFound then
// for i := 0 to DeltaDataSet.DataStruct.Count-1 do
// DeltaRec.Value[i, dvtValueEh] :=
for i := 0 to MemRecord.DataStruct.Count-1 do
AssignFieldValue(MemRecord.DataStruct.MemTableData, MemRecord, i,
dvvRefreshValue, ReaderDataSet)
else
raise Exception.Create('Key is not found in ProviderDataSet');
finally
if (Bookmark <> '') and DataSetBookmarkValid(ProviderDataSet, Bookmark) then
ProviderDataSet.Bookmark := Bookmark;
end;
// MemRecord.RefreshRecord(DeltaRec);
finally
// DeltaDataSet.Free;
end;
// Resync([]);
end;
end;
procedure TDataDriverEh.RefreshRecord(MemRecord: TMemoryRecordEh);
begin
if Assigned(OnRefreshRecord)
then OnRefreshRecord(MemRecord.DataStruct.MemTableData, MemRecord)
else DefaultRefreshRecord(MemRecord);
end;
procedure TDataDriverEh.SetKeyFields(const Value: String);
begin
FKeyFields := Value;
end;
procedure TDataDriverEh.SetProviderDataSet(const Value: TDataSet);
begin
if Value <> FProviderDataSet then
begin
FProviderDataSet := Value;
if Value <> nil then Value.FreeNotification(Self);
end;
end;
{
function TDataDriverEh.GetReaderDataSet: TDataSet;
begin
Result := ProviderDataSet;
end;
}
procedure TDataDriverEh.SetProviderEOF(const Value: Boolean);
begin
if FProviderEOF <> Value then
begin
FProviderEOF := Value;
if FProviderEOF and (FReaderDataSet <> nil) and FReaderDataSetFreeOnEof then
begin
FReaderDataSet.Free;
FReaderDataSetFreeOnEof := False;
end;
FReaderDataSet := nil;
end;
end;
destructor TDataDriverEh.Destroy;
begin
ProviderEof := True;
inherited Destroy;
end;
procedure TDataDriverEh.SetAutoIncFields(Fields: TFields; DataStruct: TMTDataStructEh);
begin
end;
{ TCustomSQLCommandEh }
constructor TCustomSQLCommandEh.Create(ADataDriver: TCustomSQLDataDriverEh);
begin
inherited Create;
FDataDriver := ADataDriver;
FCommandText := TStringList.Create;
TStringList(FCommandText).OnChange := CommandTextChanged;
end;
destructor TCustomSQLCommandEh.Destroy;
begin
FCommandText.Free;
inherited Destroy;
end;
function TCustomSQLCommandEh.GetCommandText: TStrings;
begin
Result := FCommandText;
end;
procedure TCustomSQLCommandEh.SetCommandText(const Value: TStrings);
begin
FCommandText.Assign(Value);
end;
function TCustomSQLCommandEh.Execute(var Cursor: TDataSet; var FreeOnEof: Boolean): Integer;
begin
Result := -1;
Cursor := nil;
end;
procedure TCustomSQLCommandEh.CommandTextChanged(Sender: TObject);
begin
end;
procedure TCustomSQLCommandEh.CommandTypeChanged;
begin
end;
function TCustomSQLCommandEh.GetCommandType: TSQLCommandTypeEh;
begin
Result := FCommandType;
end;
procedure TCustomSQLCommandEh.SetCommandType(const Value: TSQLCommandTypeEh);
begin
FCommandType := Value;
end;
procedure TCustomSQLCommandEh.RefreshParams(MemRecord: TMemoryRecordEh; DataValueVersion: TDataValueVersionEh);
begin
end;
function TCustomSQLCommandEh.GetOwner: TPersistent;
begin
Result := FDataDriver;
end;
function TCustomSQLCommandEh.GetNamePath: String;
begin
Result := 'SQLCommand';
end;
function TCustomSQLCommandEh.IsCommandTypeStored: Boolean;
begin
Result := (FCommandType <> DefaultCommandType);
end;
function TCustomSQLCommandEh.DefaultCommandType: TSQLCommandTypeEh;
begin
Result := DataDriver.GetDefaultCommandTypeFor(Self);
end;
procedure TCustomSQLCommandEh.Assign(Source: TPersistent);
begin
if Source is TCustomSQLCommandEh then
with (Source as TCustomSQLCommandEh) do
begin
Self.CommandText := CommandText;
Self.CommandType := CommandType;
end;
end;
{ TBaseSQLCommandEh }
constructor TBaseSQLCommandEh.Create(ADataDriver: TBaseSQLDataDriverEh);
begin
inherited Create(ADataDriver);
FParams := TParams.Create(Self);
FParamCheck := True;
end;
destructor TBaseSQLCommandEh.Destroy;
begin
FParams.Free;
inherited Destroy;
end;
procedure TBaseSQLCommandEh.RefreshParams(MemRecord: TMemoryRecordEh; DataValueVersion: TDataValueVersionEh);
var
I: Integer;
begin
for I := 0 to Params.Count - 1 do
begin
if Assigned(OnAssignParam)
then OnAssignParam(Self, MemRecord, DataValueVersion, Params[I])
else DefaultRefreshParam(MemRecord, DataValueVersion, Params[I]);
end;
end;
procedure TBaseSQLCommandEh.DefaultRefreshParam(MemRecord: TMemoryRecordEh;
DataValueVersion: TDataValueVersionEh; Param: TParam);
begin
DataDriver.AssignCommandParam(Self, MemRecord, DataValueVersion, Param);
end;
function TBaseSQLCommandEh.GetParamCheck: Boolean;
begin
Result := FParamCheck;
end;
procedure TBaseSQLCommandEh.SetParamCheck(const Value: Boolean);
begin
FParamCheck := Value;
end;
procedure TBaseSQLCommandEh.SetParams(const Value: TParams);
begin
FParams.Assign(Value);
end;
function TBaseSQLCommandEh.GetParams: TParams;
begin
Result := FParams;
end;
procedure TBaseSQLCommandEh.Assign(Source: TPersistent);
begin
inherited Assign(Source);
if Source is TBaseSQLCommandEh then
with (Source as TBaseSQLCommandEh) do
begin
Self.ParamCheck := ParamCheck;
Self.Params := Params;
end;
end;
procedure TBaseSQLCommandEh.CommandTextChanged(Sender: TObject);
begin
inherited CommandTextChanged(Sender);
if not (csReading in DataDriver.ComponentState) then
if ParamCheck then
Params.ParseSQL(CommandText.Text, True);
end;
function TBaseSQLCommandEh.GetDataDriver: TBaseSQLDataDriverEh;
begin
Result := TBaseSQLDataDriverEh(inherited DataDriver);
end;
{ TCustomSQLDataDriverEh }
constructor TCustomSQLDataDriverEh.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSelectCommand := CreateSelectCommand;
FSelectCommand.FCommandType := GetDefaultCommandTypeFor(FSelectCommand);
FUpdateCommand := CreateUpdateCommand;
FUpdateCommand.FCommandType := GetDefaultCommandTypeFor(FUpdateCommand);
FInsertCommand := CreateInsertCommand;
FInsertCommand.FCommandType := GetDefaultCommandTypeFor(FInsertCommand);
FDeleteCommand := CreateDeleteCommand;
FDeleteCommand.FCommandType := GetDefaultCommandTypeFor(FDeleteCommand);
FGetrecCommand := CreateGetrecCommand;
FGetrecCommand.FCommandType := GetDefaultCommandTypeFor(FGetrecCommand);
end;
destructor TCustomSQLDataDriverEh.Destroy;
begin
FSelectCommand.Free;
FUpdateCommand.Free;
FInsertCommand.Free;
FDeleteCommand.Free;
FGetrecCommand.Free;
FDesignDataBase := nil;
inherited Destroy;
end;
procedure TCustomSQLDataDriverEh.SetSelectCommand(const Value: TCustomSQLCommandEh);
begin
FSelectCommand.Assign(Value);
end;
procedure TCustomSQLDataDriverEh.SetDeleteCommand(const Value: TCustomSQLCommandEh);
begin
FDeleteCommand.Assign(Value);
end;
procedure TCustomSQLDataDriverEh.SetInsertCommand(const Value: TCustomSQLCommandEh);
begin
FInsertCommand.Assign(Value);
end;
procedure TCustomSQLDataDriverEh.SetGetrecCommand(const Value: TCustomSQLCommandEh);
begin
FGetrecCommand.Assign(Value);
end;
procedure TCustomSQLDataDriverEh.SetUpdateCommand(const Value: TCustomSQLCommandEh);
begin
FUpdateCommand.Assign(Value);
end;
procedure TCustomSQLDataDriverEh.DefaultProduceDataReader(var DataSet: TDataSet; var FreeOnEof: Boolean);
begin
if ProviderDataSet <> nil
then inherited DefaultProduceDataReader(DataSet, FreeOnEof)
else ExecuteCommand(SelectCommand, DataSet, FreeOnEof);
end;
procedure TCustomSQLDataDriverEh.DefaultBuildDataStruct(DataStruct: TMTDataStructEh);
var
AReaderDS: TDataSet;
AFreeOnEof: Boolean;
begin
if (ReaderDataSet <> nil) or (ProviderDataSet <> nil) then
inherited DefaultBuildDataStruct(DataStruct)
else
begin
if AReaderDS = nil then
ExecuteCommand(SelectCommand, AReaderDS, AFreeOnEof);
if AReaderDS = nil then
raise Exception.Create('SelectCommand.Execute does not get DataSet');
AReaderDS.Active := True;
DataStruct.BuildStructFromFields(AReaderDS.Fields);
AReaderDS.Active := False;
if AFreeOnEof then
AReaderDS.Free;
end;
end;
function TCustomSQLDataDriverEh.DefaultExecuteCommand(Command: TCustomSQLCommandEh;
var Cursor: TDataSet; var FreeOnEof: Boolean): Integer;
begin
{ TODO : May be use FDefaultSQLDataDriverResolver here? }
Result := Command.Execute(Cursor, FreeOnEof);
end;
function TCustomSQLDataDriverEh.ExecuteCommand(Command: TCustomSQLCommandEh;
var Cursor: TDataSet; var FreeOnEof: Boolean): Integer;
var
Processed: Boolean;
begin
Result := -1;
Processed := False;
{ TODO : Global have to be after local ExecuteCommand }
if Assigned(FDefaultSQLDataDriverResolver) then
Result := FDefaultSQLDataDriverResolver.ExecuteCommand(Self, Command, Cursor, FreeOnEof, Processed);
if not Processed then
if Assigned(OnExecuteCommand)
then Result := OnExecuteCommand(Command, Cursor, FreeOnEof)
else Result := DefaultExecuteCommand(Command, Cursor, FreeOnEof);
end;
procedure TCustomSQLDataDriverEh.DefaultRefreshRecord(MemRecord: TMemoryRecordEh);
var
i: Integer;
RecDataSet: TDataSet;
AFreeOnEof: Boolean;
begin
if ResolveToDataSet then
inherited RefreshRecord(MemRecord)
else
begin
GetrecCommand.RefreshParams(MemRecord, dvvOldestValue);
ExecuteCommand(GetrecCommand, RecDataSet, AFreeOnEof);
try
if RecDataSet.IsEmpty then
raise Exception.Create('There are no fresh record on server');
for i := 0 to MemRecord.DataStruct.Count-1 do
AssignFieldValue(MemRecord.DataStruct.MemTableData, MemRecord, i,
dvvOldestValue, RecDataSet)
{ begin
Field := RecDataSet.FindField(MemRecord.DataStruct[i].FieldName);
if Field <> nil then
MemRecord.Value[i, dvtOldestValue] := Field.Value;
end;}
finally
if AFreeOnEof then
RecDataSet.Free;
end;
end;
end;
function TCustomSQLDataDriverEh.DefaultUpdateRecord(MemTableData: TMemTableDataEh;
MemRec: TMemoryRecordEh): Integer;
var
Command: TCustomSQLCommandEh;
ResDataSet: TDataSet;
AFreeOnEof: Boolean;
begin
Result := 0;
if ResolveToDataSet then
Result := inherited DefaultUpdateRecord(MemTableData, MemRec)
else
begin
Command := nil;
case MemRec.UpdateStatus of
usModified: Command := UpdateCommand;
usInserted: Command := InsertCommand;
usDeleted: Command := DeleteCommand;
end;
if Command = nil then Exit;
Command.RefreshParams(MemRec, dvvValueEh);
Result := ExecuteCommand(Command, ResDataSet, AFreeOnEof);
GetBackUpdatedValues(MemRec, Command, ResDataSet);
if AFreeOnEof then
ResDataSet.Free;
MemRec.MergeChanges;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -