Traverse Clientdataset, generate SQL statements, and refer to the chant south to add a table of multiple primary keys
functionTform1.vartosql (value:variant): widestring;vartmp:widestring;begin if(Varisnull (Value))or(Varisempty (Value)) ThenResult:='NULL' Else CaseVartype (value) ofvardate:begintmp:= FormatDateTime ('YYYY-MM-DD Hh:mm:ss', Vartodatetime (Value)); Result:=QUOTEDSTR (TMP); End; Varstring,varolestr:result:=quotedstr (Trim (Vartostr (Value))); Varboolean:begin ifValue ThenResult:='1' ElseResult:='0'; End; Varsmallint,varinteger,vardouble,varshortint,varint64,varlongword,varcurrency:beginResult:=Trim (Vartostr (Value)); End; ElseResult:=quotedstr (Trim (Vartostr (Value))); End;End;//TableName Table name//keys field name, multiple primary keys supportedprocedureTform1.innerapplyupdates (Cds1:tclientdataset; tablename,keys:widestring);varI,j:integer;s1,s2,cmdstr,keywhere:string; cds:tclientdataset;keylist:tstringlist;beginCDs:=tclientdataset.create (Nil); Ad1. Data:=cds1. Delta; //get the value of each key keylist:= Split (keys,','); Keywhere:='Where'; forj:=0 tokeylist.count-1 Do begin ifJ= (keylist.count-1) Then beginKeywhere:=KEYWHERE+KEYLIST[J] +' = '+Vartosql (Cds[keylist[j]); End Else beginKeywhere:=KEYWHERE+KEYLIST[J] +' = '+vartosql (Cds[keylist[j]) +' and'; End; End; ifAd1. Recordcount>0 Then beginCDs. First; while notAd1. Eof Do beginCmdstr:="'; ifCds. UpdateStatus =usmodified Then beginS1:="'; fori:=0 toCds. fieldcount-1 Do begin ifCds. Fields[i]. NewValue <> variants.unassigned Then begin ifS1 ="' ThenS1:= Trim (CDs. Fields[i]. FieldName) +' = '+Vartosql (CDs. Fields[i]. Value)ElseS1:= S1 +','+ Trim (CDs. Fields[i]. FieldName) +' = '+Vartosql (CDs. Fields[i]. Value); End; End; ifS1 <>"' Then beginCmdstr:='Update'+ TableName +'Set'+ S1 +Keywhere; End; End Else ifAd1. UpdateStatus =usinserted Then beginS1:="'; fori:=0 toCds. fieldcount-1 Do begin ifCds. Fields[i]. NewValue <> variants.unassigned Then begin ifS1 ="' Then beginS1:=Trim (CDs. Fields[i]. FieldName); S2:=Vartosql (CDs. Fields[i]. Value); End Else beginS1:= S1 +','+Trim (CDs. Fields[i]. FieldName); S2:= s2 +','+Vartosql (CDs. Fields[i]. Value); End; End; End; ifS1 <>"' Then beginCmdstr:='Insert into'+ TableName +'('+ S1 +') Values ('+ s2 +')'; End; End Else ifCds. UpdateStatus =usdeleted Then beginCmdstr:='Delete'+ TableName +Keywhere; End; ifCmdstr <>"' Then beginMemo1.Lines.Add (CMDSTR); End; Cds. Next; End; End;End;procedureTform1.button1click (sender:tobject);begininnerapplyupdates (CDS1,'DM_BM','FWZH,FC,BMDM');End;functionTform1.split (s,s1:string): tstringlist;beginResult:=tstringlist.create; whilePos (S1,s) >0 Do beginResult.add (Copy (s),1, Pos (s1,s)-1)); Delete (S,1, Pos (s1,s)); End; Result.add (s);End;
Clientdataset Generating SQL