zoukankan      html  css  js  c++  java
  • 取clientdataset detal中的 更新数据, 将detal 转 数据库脚本sql

    转自永南博客,更改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 (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
  • 相关阅读:
    for xml path(''),root('')
    [小明带你玩儿Photon]4.一起来看日志
    [小明带你玩儿Photon]3.Hello World i
    [小明带你玩儿Photon]2.从零开始一个程序
    [小明带你玩儿Photon]1.Photon介绍
    杂记
    FluentNHibernate初探[1]
    [Navigation]Navigation初探[2]
    [Navigation]Navigation初探[1]
    动画系统的animator
  • 原文地址:https://www.cnblogs.com/findumars/p/5973595.html
Copyright © 2011-2022 走看看