三层中.客户端ClientDataSet1.ApplyUpdates(-1)
后,
所对应的服务端的DataSetProvieder1哪个事件里可载获数据包?我在服务端DataSetProvieder1.AfterApplyUpdates事件中这样写procedure TRDMTest.DSPAfterApplyUpdates(Sender: TObject;
  var OwnerData: OleVariant);
var
  CDS: TClientDataSet;
  ado: TADOQuery;
  S: String;
begin
  ado:= TADOQuery.Create(nil);
  try
    CDS.Data:= OwnerData;
    CDS.First;
    while not CDS.Eof do
    begin
      S:= CDS.FieldValues['Name'];
      ado.Connection:= ADOConnection1;
      ado.Close;
      ado.SQL.Clear;
      ADO.SQL.Add('Insert into T2(Name) values('+ QuotedStr(S)+')');
      ado.ExecSQL;
      CDS.Next;
    end;
  finally
    ado.Free;
  end;
end;但什么也载获不到,而且还报一个"灾难性故障"错误,望各位指教

解决方案 »

  1.   

    ado.Connection:= ADOConnection1;
    你每次循环都连接一遍
    不用的,你直接在最上面第一次连接就行了..
      

  2.   

    CSDN晕乎了关天不让发消息,晕了改成这样了,还是不行procedure TRDMTest.DSPAfterApplyUpdates(Sender: TObject;
      var OwnerData: OleVariant);
    var
      CDS: TClientDataSet;
      ado: TADOQuery;
      S: String;
    begin
      ado:= TADOQuery.Create(nil);
      ado.Connection:= ADOConnection1;
      CDS:= TClientDataSet.Create(nil);
      try
        CDS.Data:= OwnerData;
        CDS.First;
        while not CDS.Eof do
        begin
          S:= CDS.FieldValues['Name'];
          ado.Close;
          ado.SQL.Clear;
          ADO.SQL.Add('Insert into T2(Name) values('+ QuotedStr(S)+')');
          ado.ExecSQL;
          CDS.Next;
        end;
      finally
        ado.Free;
        CDS.Free;
      end;
    end;
      

  3.   

    这个OwnerData数据包的内容是什么呢?在执行ClientDataSet.ApplyUpdates(0)之后,可以在DataSetProvieder的BeforeUpdateRecord事件中做你想做的事情。
    BeforeUpdateRecord的声明格式为
    TSomeClass.SomeProviderBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet;DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;var Applied: boolean) ;
    begin
      case UpdateKind of
        ukModify:
          begin
            //todo: do something
            Applied := True;//or false 
          end;
        ukInsert:
          begin
            //todo: do something
            Applied := True;//or false 
          end;
        ukDelete:
          begin
            //todo: do something
            Applied := True;//or false 
          end;
      end;
    end;
    Applied := True时,provider就认为你已经自己处理了数据而不再对DeltaDS的数据进行处理
    Applied := false时,provider会继续对数据进行处理。DeltaDs中的数据在这个事件中始终只有一条记录。