【问题标题】:Delphi 2010 MySQL Update through ClientDataSet FailingDelphi 2010 MySQL更新通过ClientDataSet失败
【发布时间】:2011-10-12 13:24:23
【问题描述】:

我正在使用 Delphi 2010 并使用 dbexpress 连接到 MySQL 数据库。连接工作 100%,我正在检索我的数据。当我尝试通过 dbGrid 更新数据时,问题就出现了。我正在遍历表中的所有条目,对它们进行检查。调用 ApplyUpdates 方法时,我收到“未找到记录或其他用户更改记录”。

将 DataSetProvider 上的 updateMode 更改为 upWhereKeyOnly,我现在处于收到“无法找到记录,未指定密钥”的情况。我已经尝试添加

BasysClientDataSet.FieldByName('idPolicy').ProviderFlags := [pfInUpdate, pfInWhere, pfInKey];

这是代码,但我得到了同样的错误。我已经尝试将 ProviderFlags 添加到 SQLQuery,但我没有得到这样的字段“idPolicy”

【问题讨论】:

  • 包含了 dbExpress 的源代码,因此您可以调试到创建实际 SQL UPDATE 语句及其 WHERE 子句的位置。它帮助我找到了 dbExpress 应用中出现类似问题的原因。
  • 嘿,Mjn,感谢您的回复,我很确定我知道它为什么这样做,当它将数据从 MySQL 传输到 Delphi 并返回时,会出现一些 DateTimeStamps 和浮点值的失望再次,我已经在互联网上阅读了有关它的信息。这就是我希望将 UpdateMode 更改为 upWhereKeyOnly 并指定它应该在更新中使用的主键列的原因。我已经获取了它在数据库上执行的查询并删除了导致问题的列并在数据库上手动运行它并且它工作正常。
  • 好的,所以主要问题(不使用解决方法)是如何将 updatemode 设置为 upWhereKeyOnly 而不会导致“无法找到记录,未指定密钥”错误消息?也许如果这更清楚,知道它的人会回答。但另一方面,upWhereKeyOnly 在多用户环境中是危险的,因为并发用户可以覆盖彼此的更改。
  • 是的,基本上只需要告诉它在运行时在 applyUpdates 上使用特定的键。 |该程序设计为用户一次只能与一组数据交互,因此 upWhereKeyOnly 对我来说非常适用,但我似乎无法让密钥工作。

标签: mysql delphi dbexpress tclientdataset


【解决方案1】:

尝试像您一样为所有主键列设置提供程序标志 pfInKey,但不是在客户端数据集中而是在源数据集中。即使当 db express 忽略这些设置时,即使我不明白客户端数据集中的字段到底在做什么,这也能帮助我?我会说这是一个错误。

【讨论】:

    【解决方案2】:

    尝试将 DataSetProvider 组件的 ResolveToDataSet 属性设置为 True

    【讨论】:

    • 我已将属性更改为 true,但尝试在 ClientDataSet 上应用更新时仍然出现相同的错误,我还需要做些什么来强制更新使用特定列作为键更新了吗?
    • 对不起,我不知道。
    【解决方案3】:

    尝试创建此过程并在提供者BeforeUpdateRecord 事件中使用它。

    procedure SetOriginFlags(Source, Dest: TCustomClientDataSet);
    var
      i: Integer;
    begin
      for i := 0 to Source.FieldCount - 1 do
      begin
        if Dest.FindField(Source.Fields[i].FieldName) <> nil then
        begin
          Dest.FindField(Source.Fields[i].FieldName).ProviderFlags :=
            Source.Fields[i].ProviderFlags;
          if Dest.FindField(Source.Fields[i].FieldName).ProviderFlags <> [pfHidden] then
            Dest.FindField(Source.Fields[i].FieldName).Origin :=
              Source.Fields[i].FieldName;
        end;
      end;
    end;
    

    【讨论】:

      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多