Delphi TClientDataSet“尝试修改SQL Server 2008中的只读字段”错误,2000年确定

时间:2011-08-24 20:46:28

标签: delphi sql-server-2008 readonly tclientdataset

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对象的通用函数中实现的(没有关于提供者的任何内容),但现在必须这样做。

2 个答案:

答案 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标志返回到它们的座位,以便正确运行数据感知控件。