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
  • 相关阅读:
    windows 10中出现“某个应用导致****文件的默认应用设置出现问题”
    全站仪数据修正为南方cass可识别数据
    用顺序表建立一个简单的可以插入删除的学生成绩管理表
    头插法与尾插法建立单链表
    修改windows下的服务名称
    批处理同时执行多个Ant文件
    Informix数据库中的TO_DATE函数
    Ant发送邮件email
    数据库视图
    Hibernate的三种状态的解释
  • 原文地址:https://www.cnblogs.com/findumars/p/5973595.html
Copyright © 2011-2022 走看看