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对象的通用函数中实现的(没有关于提供者的任何内容),但现在必须这样做。
答案 0 :(得分:0)
我发现了问题 - 或者至少是一种解决方法。 。
WAS 设置。 TClientDataSet 对象中的列.ReadOnly = false。这适用于SQL Server 2000,但不适用于SQL Server 2008.
如果我为 TADOQuery 对象中的 列设置.ReadOnly = false提供者,然后我可以在运行时设置TClientDataSet对象中计算列的值。
对我来说并不理想,因为这是在TClientDataSet对象的通用函数中实现的(没有关于提供者的任何内容),但现在必须这样做。
答案 1 :(得分:0)
我的经验表明,通过最初调用TClientDataSet.CreaeteDataSet而不使用ReadOnly标志来创建ClientDataSet字段可以解决问题。打开ClientDataSet字段后,可以将ReadOnly标志返回到它们的座位,以便正确运行数据感知控件。