您的位置:首页 > 数据库

取clientdataset detal中的 更新数据, 将detal 转 数据库脚本sql

2016-11-25 11:29 337 查看
转自永南博客,更改update 脚本只取变化字段,更改排除blob与数组字段,这两个类型会报错

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;

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 (cdsDel
bb1e
ta.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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: