编辑:似乎DataSetProvider没有这个项目所需的功能,所以我将实现一个自定义类,用于将数据加载到ClientDataSet中。
我正在尝试从连接到我的数据库的TMSQuery获取数据,并使用DataSetProvider使用一些数据填充ClientDataSet。
我的问题是我需要修改一些这些数据才能进入我的ClientDataSet。 ClientDataSet具有与原始DB数据不匹配的持久字段。我甚至无法从DB中获取ClientDataSet中的备注字段。
ClientDataSet是我的数据层的一部分,因此我需要按字段将数据从数据库符合到ClientDataSet字段(大多数将能够直接通过,但许多将需要路由和/或转换)
有没有人有这方面的经验?
答案 0 :(得分:2)
您正在寻找TDataSetProvider.BeforeUpdateRecord事件。为此事件编写事件处理程序,您可以手动控制数据如何应用回数据库。
像这样的东西
procedure TDataModule1.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
begin
{ Set applied to tell DataSnap that you have applied this record yourself }
Applied := True;
case UpdateKind of
ukModify:
begin
Table1.Edit;
{ set the values of the fields something like this }
if not VarIsEmpty(DeltaDS.FieldByName('NewValue')) then
Table1['SomeField'] := DeltaDS.FieldByName('SomeField').NewValue;
Table1.Post;
end;
ukInsert:
begin
Table1.Insert;
{ set the values of the fields }
Table1['SomeField'] := DeltaDS['SomeField']
Table1.Post;
end;
ukDelete:
if Table1.Locate('PrimaryKeyField', DeltaDS['PrimaryKeyField'], []) then
Table1.Delete;
end; // case
end;
答案 1 :(得分:0)
如果我需要一个ClientDataSet来获得与数据库模式不完全匹配的数据,我会为TQuery组件编写一个查询,该查询以我想要的格式返回数据。然后,我为TQuery组件编写自己的,单独的,删除,插入,刷新和更新查询。
或者,您可以在数据库上创建一个视图,并使用TQuery组件中的视图。
如果您想要一个独立于数据库的自定义ClientDataSet,您需要的是内存数据集。如果您没有内存数据集组件,则Google将“TClientDataSet作为内存数据集”。你最终得到的,基本上是一个美化的列表视图组件。当然,您可以挂钩内存数据集的OnUpdateRecord,以了解何时更新您的真实数据集。
答案 2 :(得分:0)
您可以通过实现TDataSetProvider.OnGetData事件来修改发送到ClientDataSet的数据。
procedure TDataModule1.DataSetProvider1GetData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.Eof do begin
DataSet.Edit;
DataSet['Surname'] := UpperCase(DataSet['Surname']);
DataSet.Post;
DataSet.Next;
end; // while
end;
从ClientDataSet应用更新时,您可以使用TDataSetProvider.OnUpdateData事件。与OnGetData事件一样,您在整个数据集上操作而不是单个记录。
procedure TDataModule1.DataSetProvider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.Eof do begin
DataSet.Edit;
DataSet['Surname'] := LowerCase(DataSet['Surname']);
DataSet.Post;
DataSet.Next;
end; // while
end;
在OnBeforeUpdateRecord事件之前调用此OnUpdateData事件。 OnGetData和OnUpdateData事件也在整个数据集上运行,而OnBeforeUpdateRecord则为每个修改过的记录调用一次。