【发布时间】:2011-11-03 04:01:03
【问题描述】:
Embarcadero® Delphi® 2010 版本 14.0.3593.25826
我们正在尝试将数据库从 SQL Server 2000 移动到 SQL Server 2008。我有一个 TClientDataSet,它加载了一个包含计算列的 SELECT,即“SELECT Comp_Col = Column1 + ' ' + Column2... ”。
针对 SQL Server 2000 数据库运行,我可以使用以下代码修改 TClientDataSet 中列的值:
ClientDataSet1.Edit();
ClientDataSet1.FieldByName('Comp_Col').ReadOnly := false;
ClientDataSet1.FieldByName('Comp_Col').Value := 'MODIFIED';
ClientDataSet1.FieldByName('Comp_Col'').ReadOnly := true;
ClientDataSet1.Post(); // <-- EXCEPTION in 2008
但是,针对 SQL Server 2008 数据库运行时,我在执行 .Post() 时收到“尝试修改只读字段”错误。
我也尝试在上面的代码中为列设置 .ProviderFlags = '[]'(除了 .ReadOnly = false),但仍然出现错误。我也尝试在设计时通过 IDE 设置 .ReadOnly = false 和 .ProviderFlags = '[]' ,但这也无济于事。
有人知道在针对 SQL Server 2008 数据库运行时如何在 TClientDataSet 中设置计算列吗?
谢谢!
* 更新:已回答 *
我发现了问题——或者至少是一种解决方法...
我 WAS 为 TClientDataSet 对象中的列设置 .ReadOnly = false。这适用于 SQL Server 2000,但不适用于 SQL Server 2008。
如果我为正在服务的 TADOQuery 对象中的列 设置 .ReadOnly = false作为提供者,我可以在运行时在 TClientDataSet 对象中设置计算列的值。
对我来说并不理想,因为这是在 TClientDataSet 对象的通用函数中实现的(与提供者无关),但现在必须这样做。
【问题讨论】:
-
我很惊讶这是完全允许的。在旧系统中,发布时它实际上做了什么?它是否将“MOD”放入Column1并将“IFIED”放入Column2?我对数据库向您抛出 WTF 并不感到惊讶。
-
@user356740:我相信 FieldDefs 中该字段的定义在 Attributes 属性中仍然具有 faReadOnly
-
Tnx 解决方法。补充一点:
ADOQuery.Field.Readonly在打开ClientDataSet之前应该设置为False。
标签: delphi sql-server-2008 readonly tclientdataset