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;
复制代码

 

posted on   癫狂编程  阅读(183)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2018-09-19 解决并发情况下库存减为负数问题
2018-09-19 delphi怎样单步调试
2018-09-19 delphi怎么单步调试

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示