Delphi TClientDataSet 在 SQL Server 2008 中"Trying to modify read-only field"错误,在 2000 年正常



Embarcadero®Delphi®2010 Version 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 = '[]',但这也没有帮助。

有人知道如何设置一个计算列在TClientDataSet对SQL Server 2008数据库运行时?

谢谢!

* UPDATE: ANSWERED *

我发现了这个问题——或者至少是一个解决方法…

I WAS对于TClientDataSet对象中的列设置. readonly = false。这适用于SQL Server 2000,但不适用于SQL Server 2008。

如果我在TADOQuery对象中为列设置. readonly = false,而不是在作为提供者的对象中设置,那么我就能够在运行时在TClientDataSet对象中设置计算列的值。

对我来说不理想,因为这是在TClientDataSet对象的泛型函数中实现的(没有任何关于提供者的内容),但现在必须这样做。

我发现了这个问题——或者至少是一个解决方法…

I WAS对于TClientDataSet对象中的列设置. readonly = false。这适用于SQL Server 2000,但不适用于SQL Server 2008。

如果我在TADOQuery对象中为列设置. readonly = false,而不是作为提供者,那么我可以在运行时在TClientDataSet对象中设置计算列的值。

对我来说不理想,因为这是在TClientDataSet对象的泛型函数中实现的(没有任何关于提供者的内容),但现在必须这样做。

我的经验表明,通过调用TClientDataSet创建ClientDataSet字段。CreaeteDataSet最初没有ReadOnly标志解决了这个问题。打开ClientDataSet字段的ReadOnly标志后,可以返回到它们的位置,以便数据感知控件正常运行。

相关内容

最新更新