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 中设置计算列吗?
谢谢!
*更新:已回答*
我发现了问题——或者至少是一种解决方法……
我为TClientDataSet对象中的列设置 .ReadOnly = false 。这适用于 SQL Server 2000,但不适用于 SQL Server 2008。
如果我为列设置 .ReadOnly = false而不是在作为提供者的TADOQuery对象中设置,那么我可以在运行时在 TClientDataSet 对象中设置计算列的值。
对我来说并不理想,因为这是在 TClientDataSet 对象的通用函数中实现的(与提供者无关),但现在必须这样做。