【问题标题】:Copying Clientdataset records to Database table将 Clientdataset 记录复制到数据库表
【发布时间】:2015-08-03 10:31:38
【问题描述】:

我试图将记录从 tClientDataSet 插入/复制到数据库表(数据库是 Sybase ASA)。

我还有一个带有 cxgrid 的表格,我可以从 cd 中看到记录,所以我知道里面有记录。

单击按钮后,我执行以下操作:

with dmData.cds do
  begin
    Close;
    Open;
    First;
    while not (EOF) do
    begin
      dmData.qry1.Open;
      dmData.qry1.Insert;
      dmData.qry1.FieldByName('field1').AsString := dmData.cds.FieldByName('field1').AsString;
      dmData.qry1.FieldByName('field2').AsString := dmData.cds.FieldByName('field2').AsString;
      dmData.qry1.FieldByName('field3').AsString := dmData.cds.FieldByName('field3').AsString;
      dmData.qry1.Post;
      Next;
    end;
  end;

完成后我没有收到任何错误,但是在查看数据库表时没有插入任何记录。

我不知道我做错了什么,任何帮助将不胜感激。

【问题讨论】:

  • 正如 Kobim 所说,您的 dmData.qry1 中的 SQL 可能不正确。请edit您的问题并显示使用您的查询。
  • 最后添加'ApplyUpdates':此时,您正在更新ClientDataSet中的数据; “ApplyUpdates”将数据传输到基础数据集。
  • 重要的问题是:你使用什么样的查询来向数据库插入记录,他的SQL是什么?如果我们不知道这一点,我们将无法帮助您。无论如何,你可以使用:dmQuery.qry1.SQL := 'insert into table_name (field1,field2,field3) values(dmData.cds.FieldByName('field1').AsString,dmData.cds.FieldByName('field2').AsString,dmData.cds.FieldByName('field3').AsString); ' dmQuery.qry1.ExecSql;

标签: delphi delphi-xe2 sybase tclientdataset tcxgrid


【解决方案1】:

看来您正在尝试完成TClientDataSet 为您完成的工作。为了让所有这些工作您需要三个组件:

  1. 能够与您的数据服务器通信的数据集实例,已配置为这样做
  2. TDatasetProvider 的一个实例通过使用 Dataset 属性引用先前的数据集
  3. TClientDataSet 的实例通过使用 ProviderName 属性引用先前的提供程序

TClientDataset (CDS) 中的所有记录都更新后,您调用ApplyUpdates(0) 将它们发送给提供者。当您调用此方法时,CDS 会构建一个名为 Delta 的数据包,其中包含必须持久化的记录并将其发送给提供者。

提供者不知道如何保存 Delta 中存在的记录,因此它与您分配给它的数据集协同工作。对于Delta中的每条记录,都会对数据集执行相应的操作,因此数据服务器将开始接收命令。

最后,提供者通知 CDS 一切正常(这称为协调),最终返回在插入操作期间生成的密钥。这些密钥将出现在 CDS 中。

毕竟,更改记录的状态将被清除,以便报告没有待处理的更改(您的代码没有做的重要事情)。

我建议您阅读有关 DataSnap 的更多信息以真正掌握它。 Delphi 帮助中有足够的信息。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2019-09-16
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多