转自永南博客,更改update 脚本只取变化字段,更改排除blob与数组字段,这两个类型会报错
function vartosql(value: Variant): wideString;
vartmp: 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;
function GetCdsDetail(cdsDelta: TClientDataSet; TableName, KeyField, vWhere: WideString): WideString;
var
i: integer;
s1, s2: string;
CmdStr: string;
lcds: TClientDataSet;
begin
Result := '';
if (not cdsDelta.Active) and (cdsDelta.ChangeCount <= 0) then
Exit;
CmdStr := 'select * from '+TableName+' where 1=2' ;
lcds := TClientDataSet.Create(nil);
lcds.Data := Form1.SocketConnection1.AppServer.getdata('MPL', cmdstr);
for i := 1 to lcds.FieldCount do
if cdsDelta.FindField(lcds.Fields[i - 1].FieldName) <> nil then
cdsDelta.FindField(lcds.Fields[i - 1].FieldName).Tag := 1;
lcds.Close;
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 := '';
s2 := vWhere;
for i := 1 to cdsDelta.FieldCount do
// if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then
if (not cdsDelta.Fields[i - 1].IsBlob) and (not VarIsArray(cdsDelta.Fields[i - 1].Value)) then
if (cdsDelta.Fields[i - 1].NewValue <> Variants.Unassigned) and (cdsDelta.Fields[i - 1].Tag = 1)
and (cdsDelta.Fields[i - 1].OldValue <> cdsDelta.Fields[i - 1].NewValue) 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;
Result := Result + CmdStr + #13#10;
cdsDelta.Next;
end;
end;
FreeAndNil(lcds);
end;
http://blog.csdn.net/y281252548/article/details/53332584