function TDSServer.UpdateCompany(Delta: OleVariant;
  var Msg: WideString): Integer;
var
  cdsTemp: TClientDataSet;
  i, tempInt: integer;
  cmdInsert, cmdDelete, cmdUpdate: TADOCommand;
  sname, chMsg: string;
  tempstr: WideString;
begin
  adoConnDS.Errors.Clear; //for catch the error
  cdsTemp := TClientDataSet.Create(Self);
  cmdInsert := TADOCommand.Create(Self);
  cmdDelete := TADOCommand.Create(Self);
  cmdUpdate := TADOCommand.Create(Self);
  cmdInsert.Connection := adoConnDS;
  cmdDelete.Connection := adoConnDS;
  cmdUpdate.Connection := adoConnDS;
  Result := 0;
  cmdUpdate.CommandText := 'update Company set '
    + 'sCompanyName = :sCompanyName,'
    + 'sHeadName = :sHeadName, sHeadTelNum = :sHeadTelNum,ckind=:ckind,'
    + 'cType = :cType,tSurvey = :tSurvey where sCompanyID = :OLD_sCompanyID';  cmdDelete.CommandText := 'delete from Company where sCompanyID = :OLD_sCompanyID';  cmdInsert.CommandText := 'insert into Company '
    + '(sCompanyID, sCompanyName, sHeadName, sHeadTelNum,ckind,cType, tSurvey)'
    + ' values(:sCompanyID, :sCompanyName, :sHeadName, :sHeadTelNum,:ckind,:cType, :tSurvey)';  adoConnDS.BeginTrans;
  try
    try
      cdsTemp.Data := Delta;
      cdsTemp.First;
      while not cdsTemp.EOF do
        begin
          case cdsTemp.UpdateStatus of
            usUnModified:
              begin
                for i := 0 to cmdUpdate.Parameters.Count - 2 do
                  begin
                    sName := cmdUpdate.Parameters.Items[i].Name;
                    cmdUpdate.Parameters.Items[i].Value :=
                      cdsTemp.fieldbyName(sName).Value;
                  end;
                cmdUpdate.Parameters.ParamByName('OLD_sCompanyID').Value :=
                  cdsTemp.FieldByName('sCompanyID').value;
              end;
            usModified:
              begin
                for i := 0 to cmdUpdate.Parameters.Count - 2 do
                  begin
                   if not (cdsTemp.fieldbyName(cmdUpdate.Parameters.Items[i].Name).IsNull ) then
                      begin
                        sName := cmdUpdate.Parameters.Items[i].Name;
                        cmdUpdate.Parameters.Items[i].Value :=
                          cdsTemp.fieldbyName(sName).Value;
                      end;
                  end;
                cmdUpdate.Execute;
              end;
            usInserted:
              begin
                for i := 0 to cmdInsert.Parameters.Count - 1 do
                  begin
                    sName := cmdInsert.Parameters.Items[i].Name;
                    cmdInsert.Parameters.Items[i].Value :=
                      cdsTemp.fieldbyName(sName).Value;
                  end;
                cmdInsert.Execute;
              end;
            usDeleted:
              begin
                cmdDelete.Parameters.ParamByName('OLD_sCompanyID').Value :=
                  cdsTemp.Fieldbyname('sCompanyID').Value;
                cmdDelete.Execute;
              end;
          end;
          cdsTemp.Next;
        end;
      adoConnDS.CommitTrans;
    except
      adoConnDS.RollbackTrans;
      CatchADOError(tempInt, tempstr, chMsg);
      Msg := tempstr;
      Result := tempInt;
    end;
  finally
    cdsTemp.Free;
    cmdInsert.Free;
    cmdDelete.Free;
    cmdUpdate.Free;
  end;
end;该函数中的delta是一个临时表,是clientdataset.delta,是返回的一个临时表!1,clientdataset.delta,临时表的意思?
2,OLD_sCompanyID是属于临时表中的记录吗?
2,在上边的代码的“cmdDelete.CommandText := 'delete from Company where sCompanyID = :OLD_sCompanyID'”;中的OLD_sCompanyID是表示临时表的记录吗?

解决方案 »

  1.   

    clientdataset.delta保存的是对数据库进行新增或修改后信息,便于向DATAPROVIDER提交数据更新。
    clientdataset.delta,有三个字段.字段名忘了,,自己查查
      

  2.   

    不同于数据库的临时表,如果通过TDataSetProvider来ApplyUpdates,提交数据,
    就会在数据库建立一个实在的数据表,
    删除改表就要使用sql上传了。
      

  3.   

    clientdataset.delta保存的是对数据库进行新增或修改后信息,便于向DATAPROVIDER提交数据更新。
      

  4.   

    读了一下你的function TDSServer.UpdateCompany(Delta: OleVariant;...);
    在这个函数中很巧妙的应用了TClientDataSet。1.clientdataset.delta,临时表的意思?
     TClientDataSet(cdsTemp)的表结构应该与一个实际表(Company)的表结构相同.
     在cdsTemp放入了要传入的数据(看作临时表),然后根据cdsTemp.UpdateStatus的
     状态,把cdsTemp中的数据对实际表(Company)做插入,修改或删除.2.OLD_sCompanyID是属于临时表中的记录吗? 不是, 是参数。
     是対下述SQL文的条件付値、找相同的sCompanyID。
      update Company 
         set ...
       where sCompanyID = :OLD_sCompanyID