• clientdataset生成sql


    遍历clientdataset,生成sql语句,参照咏南写则,增加了一表多主键的情况

    function TForm1.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;
    
    //TableName 表名
    //keys 字段名,支持多个主键
    procedure TForm1.InnerApplyUpdates(cds1:TClientDataSet;TableName,keys:WideString);
    var
    i,j:integer;
    s1,s2,CmdStr,keyWhere:string;
    cds:TClientDataSet;
    keyList:TStringList;
    begin
      cds:=TClientDataSet.Create(nil);
      cds.Data:=cds1.Delta;
    
      //获取每个Key的值
      keyList := split(keys,',');
      keyWhere:=' Where ';
      for j:=0 to keyList.count-1 do
      begin
         if j=(keyList.count-1) then
         begin
           keyWhere:=keyWhere+keyList[j] + ' = '+VarToSql(cds[keyList[j]]);
         end
         else
         begin
           keyWhere:=keyWhere+keyList[j] + ' = '+VarToSql(cds[keyList[j]])+' and ';
         end;
      end;
    
      if cds.RecordCount>0 then
      begin
         cds.First;
         while not cds.Eof do
         begin
            CmdStr:='';
            if cds.UpdateStatus =usModified then
            begin
                s1 := '';
                for i:=0 to cds.FieldCount-1 do
                begin
                   if cds.Fields[i].NewValue <> Variants.Unassigned then
                   begin
                      if s1 = '' then
                        s1 := Trim(cds.Fields[i].FieldName) + ' = ' + VarToSql(cds.Fields[i].Value)
                      else
                        s1 := s1 + ',' + Trim(cds.Fields[i].FieldName) + ' = ' + VarToSql(cds.Fields[i].Value);
                   end;
                end;
              
                if s1 <> '' then
                begin
                  CmdStr := 'Update ' + TableName + ' Set ' + s1 +keyWhere;
                end;    
            end
            else if cds.UpdateStatus =usInserted then
            begin
                s1 := '';
                for i:=0 to cds.FieldCount-1 do
                begin
                   if cds.Fields[i].NewValue <> Variants.Unassigned then
                   begin
                      if s1 = '' then
                      begin
                        s1 := Trim(cds.Fields[i].FieldName);
                        s2 := VarToSql(cds.Fields[i].Value);
                      end
                      else
                      begin
                        s1 := s1 + ',' + Trim(cds.Fields[i].FieldName);
                        s2 := s2 + ',' + VarToSql(cds.Fields[i].Value);
                      end;
                   end;
                end;
              
                if s1 <> '' then
                begin
                   CmdStr := 'Insert into ' + TableName + '(' + s1 + ') Values (' + s2 + ')';
                end;    
            end
            else if cds.UpdateStatus =usDeleted then
            begin
                CmdStr := 'Delete ' + TableName +keyWhere;
            end;
    
            if CmdStr <> '' then
            begin
              Memo1.Lines.Add(CmdStr);
            end;
            cds.Next;
         end;
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      InnerApplyUpdates(cds1,'dm_bm','fwzh,fc,bmdm');
    end;
    
    
    function TForm1.split(s,s1:string):TStringList;
    begin
      Result:=TStringList.Create;
      while Pos(s1,s)>0 do
      begin
        Result.Add(Copy(s,1,Pos(s1,s)-1));
        Delete(s,1,Pos(s1,s));
      end;
      Result.Add(s);
    end;
    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    os和sys模块
    time模块
    collections模块
    re模块
    Python初识一
    Python闭包函数
    压栈
    isinstance()和issubclass()
    匿名函数--lambda函数
    机器学习入门文章
  • 原文地址:https://www.cnblogs.com/jijm123/p/13695188.html
Copyright © 2020-2023  润新知