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