我有一个包含以下控件的表单:TDBEditTDBMemoTDataSourceTClientDataSet

如果用户编辑字段,然后单击表单上仅调用MyCDS.Cancel方法的按钮(以取消编辑),则TDBEdit字段将还原为其原始值,但TDBMemo字段不会还原(它们设置为空白值)。

TClientDataSet是从MSSQLServer 2008数据库填充的。 TDBEdit字段是数据库中的nvarchar(255),而TDBMemonvarchar(max)xml字段。

查看调试检查器中的值(ctrl + F7,MyCDS.FieldByName('afield'),Inspect)对于nvarchar(max)字段之一显示以下内容:


数据大小= 0
数据类型= ftWideMemo
大小= 1


对于所有nvarchar(max)xml字段,这都是相同的,无论基础字段是否具有数据。

看来在nvarchar(max)(被视为ftWideMemo)和TDBMemo控件之间存在不兼容。

有人以前见过这样的问题吗?您对如何解决有什么建议?

最佳答案

如果有兴趣的人,问题是TClientDataSet组件中的错误。仅当您克隆数据集,没有Provider并关闭LogChanges时,才会出现此问题。如果在克隆的数据集中编辑记录,然后取消编辑,则所有备注字段都会丢失其值。

由于不必在基于文件的应用程序中使用Provider,因此启用LogChanges并非总是有意义。但是,要解决备忘录字段的限制,可以保留LogChanges的状态,然后在更改克隆数据集的操作之后调用MergeChangeLog

我创建了一个演示该问题的程序。请参阅Embarcadero事件QC#110511。

关于delphi - TClientDataSet.Cancel丢失TDBMemo值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13388662/

10-10 01:45