Py学习  »  DATABASE

我的clientDataSet.applyUpdates没有发布到我的mysql数据库表?

Mel • 6 年前 • 307 次点击  

我想知道为什么我的clientDataSet上发布的数据没有使用applyUpdates更新到mysql数据库表。

我正在处理两个数据库。

  1. db1.customerTable1:没有问题,主键位于“listid”>cds.append>cds.applyUpdates

  2. db2.customerTable2:有问题时,主键位于'guid'>cds.edit>cds.applyUpdates。

我在db2.customerTable2上添加了带有“listid”的主键,但仍然不起作用。

在代码下面,我正在处理。

procedure TfrmMain.spbExportClick(Sender: TObject);
var
  Guid , VarAccountId, VarListSasId, VarListDspId : Variant;
  Status : String;
begin
  with dm.dmForm do
  begin
    cdsCustomer2.first;
    while not cdsCustomer2.eof do
    begin

      //variable data for CDS.Customer1.AllFields
      Guid := cdsCustomer2.FieldByName ('Guid').AsString;
      VarAccountId := cdsCustomer2.FieldByName('ListID').AsString;
      VarListSasId := cdsCustomer2.FieldByName('FullName').AsString;
      VarListDspId := cdsCustomer2.FieldByName('Name').AsString;
      Status := 'Out';

      //posting to CDS.Customer1.AllFields
      cdsCustomer1.DisableControls;
      cdsCustomer1.Append;
      cdsCustomer1.FieldByName('GUID').AsString := Guid;
      cdsCustomer1.FieldByName('AccountId').AsString := VarAccountId;
      cdsCustomer1.FieldByName('ListSasID').AsString := VarListSasId;
      cdsCustomer1.FieldByName('ListDspID').AsString := VarListDspId;
      cdsCustomer1.FieldByName('Status').AsString := Status;
      cdsCustomer1.EnableControls;
      cdsCustomer1.Fields[1].ProviderFlags := [pfInKey];
      cdsCustomer1.Post;

      //posting Guid value back to CDS.Customer2
      if cdsCustomer2.locate('ListID', VarAccountId, [])  then
      begin
        cdsCustomer2.DisableControls;
        cdsCustomer2.Edit;
        cdsCustomer2.FieldByName('ExternalGUID').AsString := Guid;
        cdsCustomer2.EnableControls;
        cdsCustomer2.Fields[0].ProviderFlags := [pfInKey];
        cdsCustomer2.Post;
      end;

      cdsCustomer2.Next;
    end;

    //ApplyUpdates to mysql Customer1.Table and Customer2.Table
    cdsCustomer1.ApplyUpdates(-1);
    cdsCustomer2.ApplyUpdates(-1);

  end;
end;

我希望这些代码可以像数据库1一样简单地发布到我的mysql数据库2。除了发布DB2的CDSCustomer2之外,所有内容都可以发布到两个客户端数据集。

如果我遗漏了一些你可能需要的信息,请告诉我。

附笔。 下面是数据库结构: uniconnection->mysqluniprovider->uniquery->datasetprovider->clientdataset->datasource->dbgrid

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38484
文章 [ 3 ]  |  最新文章 6 年前
Mel
Reply   •   1 楼
Mel    6 年前

在复制这个案例以隔离错误的确切来源之后。我意识到我没有为其他数据库创建连接。因此,本例的解决方案是为每个数据库创建连接,以便与2个数据库无缝通信。

为了进一步说明,下面是我现在拥有的连接,到目前为止,我在同步2个数据库时没有发现任何错误:

数据库1>tuniconnection1>mysqluniprovider1>tuniquery1>tdatasetprovider1>t客户数据集1>tdatasource1>tdbgrid1

数据库2_gt;tuniconnection2_gt;mysqluniprovider2_gt;tuniquer2_gt;tdatasetprovider2_gt;tclientdataset2_gt;tdatasource2_gt;tdbgrid2

我不确定在一个项目中是否有更好的方法来同时管理多个数据库连接。但是,这对我有用。

RichardS
Reply   •   2 楼
RichardS    6 年前

将引发异常添加到DataSetProvider的OnUpdateRor中-默认情况下,异常是静默的,我从未完全理解。所以类似于引发异常(e.message)-您可能会发现您试图为一个必须为非空或类似的字段设置空值。

MartynA
Reply   •   3 楼
MartynA    6 年前

诊断应用程序更新的问题可能有点乏味,因为有时这是一个问题,通过一系列的可能性,直到你找到一个适合你的情况,所以我不能告诉你“只是做这个…”,它将解决你的问题。

然而,在您开始研究可能性之前,您的代码有一些问题需要修复,否则您不太可能找到任何地方。

  • 您对ApplyUpdates的调用

    cdsCustomer1.ApplyUpdates(-1);
    cdsCustomer2.ApplyUpdates(-1);
    

将此更改为

  var Count : Integer;
  [...]
  Count := cdsCustomer1.ApplyUpdates(0);
  Assert(Count = 0);
  Count := cdsCustomer2.ApplyUpdates(0);
  Assert(Count = 0);

关键是,指定-1作为applyUpdates的参数 与你想要的完全相反,也就是说,它允许任何数量的错误 在ApplyUpdates进程中生成。你想要的是 停止任何错误,这是0将要执行的操作,以便您可以找到 ApplyUpdates期间返回了什么错误。

阿尔索

  • 当您更新CDSCustomer2时,错误地您正在呼叫 CDSCustomer公司 .disablecontrols而不是cdscuster2.disablecontrols。现在看来,此错误将阻止随后正确显示CDSCustomer1。

进行这些更改,编译并运行你的应用程序,也许是其中之一 Count := [...] 威尔给你一个异常消息,它可以识别 你的问题的原因。如果没有:

  • 检查在您的服务器上,两个表都定义了主键,以及 然后检查CDS的正确字段是否具有 pfInkey 供应商 设置标志。如果有,请尝试将其设置为pfinwhere。

  • 在vcl源文件provider.pas中,查找过程

过程tsqlvolver.internaldoupdate(tree:tupdatetree;updateKind:tupdateKind);

它的最后一行应该是

DoExecSQL(FSQL, FParams);

在它上面放置一个断点,运行你的应用程序,当它在bp上停止时,评估 看看它是否正确。如果是这样,请尝试从用于与服务器一起工作的任何mysql实用工具中执行相同的SQL。