短版
我怎么称呼:
dataset1.FieldByName(fieldName).AsString := 'Something';
并且有效吗?
长版
我有一个DataSet
:
var
ds: tdataset;
ds := GetsomeSortOfDatasetfromSomewhere();
此数据集将被导出(例如导出到Excel,cSV,TSV,Markdown,HTML,XML):
Exportdataset(ds);
,导出将包含所有列和所有行:
| username | Fullname |
|----------|-------------------------|
| ian | IAN BOYD |
| MartynA | MARTIN |
| ngal | NASREDDINE GALFOUT |
| uewr | UWE RAABE |
现在,我想在进行其他操作之前修改内存中每行的Fullname
字段(即,它永远不会返回数据库,我不知道在哪里它来自,可能不是来自数据库):
while not ds.EOF do
begin
ds.FieldByName('Fullname').AsString := FormatNamePrettyLike(ds.FieldByName('Fullname').AsString;
ds.Next;
end;
尝试修改字段会产生异常:
解决方案是将数据集克隆到内存TClientDataset
:
///<summary>Clones a dataset into a TClientdataset; which is an editable in-memory DataSet.</summary>
function CloneDataSet(dsSource: tdataset): tdataset; //tdataset > TCustomClientdataset > TClientdataset
var
tempProvider: tdatasetProvider;
data: OleVariant;
ds: TClientdataset;
begin
tempProvider := tdatasetProvider.Create(nil);
try
tempProvider.DataSet := dsSource;
data := tempProvider.Data;
finally
tempProvider.Free;
end;
ds := TClientdataset.Create(nil);
ds.Data := data;
Result := ds;
end;
哪个给出了更大的代码:
var
ds: tdataset;
dsEditable: tdataset;
ds := GetDataSomeOfSomeSortFromSomewhere();
//Clone to dataset to an in-memory dataset so we can modify it.
dsEditable := CloneDataSet(ds);
ds.Free;
ds := edEditable;
while not ds.EOF do
begin
ds.FieldByName('Fullname').AsString := FormatNamePrettyLike(ds.FieldByName('Fullname').AsString;
ds.Next;
end;
但这会导致错误:
解决方案是put the dataset in edit mode:
//The in-memory Clientdataset won't be editable until you mark it editable.
ds.Edit;
///<summary>Clones a dataset into a TClientdataset; which is an editable in-memory DataSet.</summary>
function CloneDataSet(dsSource: tdataset): tdataset; //tdataset > TCustomClientdataset > TClientdataset
var
tempProvider: tdatasetProvider;
data: OleVariant;
ds: TClientdataset;
begin
tempProvider := tdatasetProvider.Create(nil);
try
tempProvider.DataSet := dsSource;
data := tempProvider.Data;
finally
tempProvider.Free;
end;
ds := TClientdataset.Create(nil);
ds.Data := data;
//The in-memory Clientdataset won't be editable until you mark it editable.
ds.Edit;
Result := ds;
end;
现在重复锻炼会出现错误:
字段
Fullname
无法修改。
解决方案是set Field.ReadOnly to false:
//Even after marking the in-memory data-set as editable,you still can't edit it
//until you mark all fields as editable.
for i := 0 to ds.FieldCount-1 do
ds.Fields[i].ReadOnly := False;
///<summary>Clones a dataset into a TClientdataset; which is an editable in-memory DataSet.</summary>
function CloneDataSet(dsSource: tdataset): tdataset; //tdataset > TCustomClientdataset > TClientdataset
var
tempProvider: tdatasetProvider;
data: OleVariant;
ds: TClientdataset;
begin
tempProvider := tdatasetProvider.Create(nil);
try
tempProvider.DataSet := dsSource;
data := tempProvider.Data;
finally
tempProvider.Free;
end;
ds := TClientdataset.Create(nil);
ds.Data := data;
//The in-memory Clientdataset won't be editable until you mark it editable.
ds.Edit;
//Even after marking the in-memory data-set as editable,you still can't edit it
//until you mark all fields as editable.
for i := 0 to ds.FieldCount-1 do
ds.Fields[i].ReadOnly := False;
Result := ds;
end;
重复练习会出现错误:
尝试修改只读字段。
所以我放弃了。如何编辑数据集字段?
所有克隆的内存TCustomClientdataset内容都在这里;我只想在客户端上对其进行编辑以用于显示。
奖励聊天
很明显,我无法在数据集中添加新列:
| username | Fullname | PrettyFullname |
|----------|-------------------------|--------------------|
| ian | IAN BOYD | Ian Boyd |
| MartynA | MARTIN | Martin |
| ngal | NASREDDINE GALFOUT | Nasreddine Galfout |
| uewr | UWE RAABE | Uwe Raabe |
很明显,我无法将事件处理程序附加到数据集:
- 因为当数据集传递到链中的下一个人(例如线程),并且原始形式被释放时,数据处理程序将无效
- 这也不是我要的;关于修改数据集的内容 值的更新会影响其他系统(例如数据库,Web服务等)。我希望更改一次,然后输入数据集