我的目的是想用一个tmp adoquery去更新数据库,因为tmp adoquery是多个表的view,而多个表view,adoquery.post会更新多个tabel,所以用update set ...去更新Table<br>adod.sql.add(我想动态产生)<br>如何确定要个field被更改过,我用ados.fields.oldvalue <> ados.fields.value 比较,但这里出现错误.<br><br>function Tform1.updatetable(ados:Tadoquery;lcTable:string):Boolean;<br>var<br> i:integer;<br> msql:string;<br> lnparm:string;<br> lnkey:variant;<br> msql1,msql2,msql3:string;<br> adod:Tadoquery;<br>// lcold,lcnew:variant;<br>begin<br> lnparm:='';<br> msql:='';<br> adod:=Tadoquery.Create(nil);<br> adod.Connection:=form1.ADOConnection1;<br> adod.Close;<br> adod.SQL.Clear;<br> lnkey:=ados.Fields[0].AsInteger;<br> if (lnkey>0) then<br> begin<br> msql1:='update '+lcTable +' set ';<br> msql2:='';<br> msql3:='';<br> for i:=1 to ados.FieldCount-1 do<br> if ((copy(ados.Fields.FieldName,0,2) <> 'tmp') and (ados.Fields.FieldName <> 'iren') and (ados.Fields.FieldName <> 'idate') and (ados.Fields.FieldName <> 'uren') and (ados.Fields.FieldName <> 'udate')) then<br> begin<br> if ados.Fields.OldValue<>ados.Fields.Value then ----> ERROR "Invaild variant operation" please help me<br> msql2:=msql2+ados.Fields.FieldName+'=:'+ados.Fields.FieldName+',';<br> end;<br> // end;<br> msql2:=copy(trim(msql2),0,length(trim(msql2))-1);<br> if (length(msql2) <> 0) then<br> begin<br> msql1:=msql1+msql2+',uren=:uren,udate=:udate where id=:id';<br> adod.SQL.add(msql1);<br> for i:=1 to ados.FieldCount-1 do<br> begin<br> if ((copy(ados.Fields.FieldName,0,2) <> 'tmp') and (ados.Fields.FieldName <> 'iren') and (ados.Fields.FieldName <> 'idate') and (ados.Fields.FieldName <> 'uren') and (ados.Fields.FieldName <> 'udate')) then<br> begin<br> if [red]ados.Recordset.Fields.OriginalValue<>ados.Recordset.Fields.Value[/red] then ---<br> begin<br> lnparm:=ados.Fields.FieldName ;<br> adod.Parameters.ParamByName(lnparm).Value:=ados.Fields.Value;<br> end;<br> end; <br> end;<br> adod.Parameters.ParamByName('uren').Value :='admin';<br> adod.Parameters.ParamByName('udate').Value:=now();<br> adod.Parameters.ParamByName('id').value:=ados.Fields[0].Value;<br> adod.Prepared:=true;<br> try<br> adod.ExecSQL;<br> result:=true;<br> except<br> result:=false;<br> end;<br> adod.Free;<br> end;<br> end