我有一个包含以下控件的表单:TDBEdit
,TDBMemo
,TDataSource
,TClientDataSet
如果用户编辑字段,然后单击表单上仅调用MyCDS.Cancel
方法的按钮(以取消编辑),则TDBEdit
字段将还原为其原始值,但TDBMemo
字段不会还原(它们设置为空白值)。TClientDataSet
是从MSSQLServer 2008数据库填充的。 TDBEdit
字段是数据库中的nvarchar(255)
,而TDBMemo
是nvarchar(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/