【问题标题】:Delphi TClientDataSet "Trying to modify read-only field" error in SQL Server 2008, OK in 2000SQL Server 2008 中的 Delphi TClientDataSet“尝试修改只读字段”错误,2000 中可以
【发布时间】:2011-11-03 04:01:03
【问题描述】:

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 中设置计算列吗?

谢谢!

* 更新:已回答 *

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

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

如果我为正在服务的 TADOQuery 对象中的列 设置 .ReadOnly = false作为提供者,我可以在运行时在 TClientDataSet 对象中设置计算列的值。

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

【问题讨论】:

  • 我很惊讶这是完全允许的。在旧系统中,发布时它实际上做了什么?它是否将“MOD”放入Column1并将“IFIED”放入Column2?我对数据库向您抛出 WTF 并不感到惊讶。
  • @user356740:我相信 FieldDefs 中该字段的定义在 Attributes 属性中仍然具有 faReadOnly
  • Tnx 解决方法。补充一点:ADOQuery.Field.Readonly在打开ClientDataSet之前应该设置为False

标签: delphi sql-server-2008 readonly tclientdataset


【解决方案1】:

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

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

如果我将 .ReadOnly = false 设置为 TADOQuery 对象中的列 提供程序,然后我可以在运行时设置 TClientDataSet 对象中计算列的值。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2011-03-16
      相关资源
      最近更新 更多