2

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 对象的通用函数中实现的(与提供者无关),但现在必须这样做。

4

2 回答 2

0

我发现了问题——或者至少是一种解决方法。. .

我为TClientDataSet对象中的列设置 .ReadOnly = false 这适用于 SQL Server 2000,但不适用于 SQL Server 2008。

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

对我来说并不理想,因为这是在 TClientDataSet 对象的通用函数中实现的(与提供者无关),但现在必须这样做。

于 2011-08-25T23:38:38.163 回答
0

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

于 2013-09-06T14:04:09.483 回答