根据DELTA自动生成SQL语句上传客户端的CLIENTDATASET.delta到服务器的clientdataset.data,服务端解析clientdataset的数据生成相应的SQL语句。相对于直接调用datasetprovider.applyupdates()方法提交数据而言,前者的可控性更强,对于某些要求灵活性很强的场合,前者可能是必须的提交方式。procedure TBaseService.ApplyUpdates(const Delta: OleVariant; TableName, KeyField: WideString);var Flag: Boolean;begin if VarIsNull(Delta) then exit; with (FParent as TDataServer2) do begin cdsDelta.Close; cdsDelta.Data := Delta; Flag := cdsDelta.FindField('SYS_STATUS') nil; end; // with if Flag then InnerApplyUpdates2(TableName, KeyField) else InnerApplyUpdates(TableName, KeyField);end; function vartosql(value: Variant): wideString; var tmp:widestring; begin if (varisnull(Value)) or (varisempty(Value)) then Result:='NULL' else case Vartype(value) of varDate: begin tmp := formatDatetime('yyyy-mm-dd hh:mm:ss', VartoDatetime(Value)); Result:=Quotedstr(tmp); end; varString,varOlestr: Result:=Quotedstr(Trim(Vartostr(Value))); varboolean: begin if Value then Result:='1' else Result:='0'; end; varSmallint,varInteger,varDouble,varShortInt,varInt64,varLongWord,varCurrency: begin Result:=trim(Vartostr(Value)); end; else Result:=Quotedstr(Trim(Vartostr(Value))); end; end;procedure TBaseService.InnerApplyUpdates(TableName, KeyField: WideString);var i: integer; s1, s2: string; CmdStr: string; FieldList: TStringList;begin with (FParent as TDataServer2) do begin FieldList := TStringList.Create; Connection.GetFieldNames(TableName, FieldList); if not cdsDelta.Active then cdsDelta.Open; for i := 1 to FieldList.Count do if cdsDelta.FindField(FieldList[i - 1]) nil then cdsDelta.FindField(FieldList[i - 1]).Tag := 1; FieldList.Free; if cdsDelta.RecordCount > 0 then begin cdsDelta.First; s1 := ''; s2 := ''; while not cdsDelta.Eof do begin CmdStr := ''; case cdsDelta.UpdateStatus of usUnmodified: begin s2 := VarToSql(cdsDelta[KeyField]); end; usModified: begin s1 := ''; for i := 1 to cdsDelta.FieldCount do // if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then if (cdsDelta.Fields[i-1].NewValue System.Variants.Unassigned and (cdsDelta.Fields[i - 1].Tag = 1) then begin if s1 = '' then s1 := Trim(cdsDelta.Fields[i - 1].FieldName) + ' = ' + VarToSql(cdsDelta.Fields[i - 1].Value) else s1 := s1 + ',' + Trim(cdsDelta.Fields[i - 1].FieldName) + ' = ' + VarToSql(cdsDelta.Fields[i - 1].Value); end; if s1 '' then begin CmdStr := 'Update ' + TableName + ' Set ' + s1 + ' Where ' + KeyField + ' = ' + s2; end; end; usInserted: begin s1 := ''; s2 := ''; for i := 1 to cdsDelta.FieldCount do if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then begin if s1 = '' then begin s1 := Trim(cdsDelta.Fields[i - 1].FieldName); s2 := VarToSql(cdsDelta.Fields[i - 1].Value); end else begin s1 := s1 + ',' + Trim(cdsDelta.Fields[i - 1].FieldName); s2 := s2 + ',' + VarToSql(cdsDelta.Fields[i - 1].Value); end; end; if s1 '' then begin CmdStr := 'Insert into ' + TableName + '(' + s1 + ') Values (' + s2 + ')'; end; end; usDeleted: begin s2 := VarToSql(cdsDelta[KeyField]); CmdStr := 'Delete ' + TableName + ' Where ' + KeyField + ' = ' + s2; end; end; if CmdStr '' then Cmd.Execute(CmdStr); cdsDelta.Next; end; cdsDelta.First; cdsDelta.EmptyDataSet; cdsDelta.Close; end; end;end; 09-06 18:58