delphi clientdataset 转 sql

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 GetCdsDetailSsql(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 := u_mainFrm.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 := ' where ' + KeyField + '=' + VarToSql(cdsDelta[KeyField]);
            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
              begin
                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
                  s1 := s1 + #13#10 + ' update ' + TableName + ' set ' + Trim(cdsDelta.Fields[i - 1].FieldName) + ' = ' + VarToSql(cdsDelta.Fields[i - 1].NewValue) +  s2;


                end;
              end;
             CmdStr := s1;
          end;
        usInserted:
          begin
            s1 := '';
            s2 := '';
            for i := 1 to cdsDelta.FieldCount do
              if not cdsDelta.Fields[i - 1].IsBlob then
                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 from  ' + TableName + ' Where ' + KeyField + ' = ' + s2;
          end;
      end;
      Result := Result + CmdStr + #13#10;
      cdsDelta.Next;
    end;
  end;
  FreeAndNil(lcds);
end;

猜你喜欢

转载自blog.csdn.net/y281252548/article/details/80476966
今日推荐