zoukankan      html  css  js  c++  java
  • 根据DELTA自动生成SQL语句

    上传客户端的CLIENTDATASET.delta到服务器的clientdataset.data,服务端解析clientdataset的数据生成相应的SQL语句。

    相对于直接调用datasetprovider.applyupdates()方法提交数据而言,前者的可控性更强,对于某些要求灵活性很强的场合,前者可能是必须的提交方式。

    procedure TBaseService.ApplyUpdates(const Delta: OleVariant; TableName, KeyField: WideString);
    var
      Flag: Boolean;
    begin
      if VarIsNull(Delta) then exit;
      with (FParent as TDataServer2) do
        begin
          cdsDelta.Close;
          cdsDelta.Data := Delta;
          Flag := cdsDelta.FindField('SYS_STATUS') <> nil;
        end; // with
      if Flag then
        InnerApplyUpdates2(TableName, KeyField)
      else
        InnerApplyUpdates(TableName, KeyField);
    end;

     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;

    procedure TBaseService.InnerApplyUpdates(TableName, KeyField: WideString);
    var
      i: integer;
      s1, s2: string;
      CmdStr: string;
      FieldList: TStringList;
    begin
      with (FParent as TDataServer2) do
        begin
          FieldList := TStringList.Create;
          Connection.GetFieldNames(TableName, FieldList);
          if not cdsDelta.Active then cdsDelta.Open;
          for i := 1 to FieldList.Count do
            if cdsDelta.FindField(FieldList[i - 1]) <> nil then
              cdsDelta.FindField(FieldList[i - 1]).Tag := 1;
          FieldList.Free;
          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 := '';
                        for i := 1 to cdsDelta.FieldCount do
                         // if (not cdsDelta.Fields[i - 1].IsNull) and (cdsDelta.Fields[i - 1].Tag = 1) then

     if (cdsDelta.Fields[i-1].NewValue <> System.Variants.Unassigned and (cdsDelta.Fields[i - 1].Tag = 1) 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;
                  if CmdStr <> '' then Cmd.Execute(CmdStr);
                  cdsDelta.Next;
                end;
              cdsDelta.First;
              cdsDelta.EmptyDataSet;
              cdsDelta.Close;
            end;
        end;
    end;

  • 相关阅读:
    深入理解Java内存(图解堆栈)
    Python 通过脚本获取Android的apk的部分属性,再通过加密算法生成秘钥。
    Android开发中碰到的一个ANR问题。
    Android 解决通过自定义设置打开热点后手机搜索不到热点的问题。
    Android 反射获取一个方法(方法的参数不一样)
    Android 通过反射获取DatePicker 中的控件,并改变其颜色
    Android 解析标准的点击第三方文件管理器中的视频的intent
    Fragment已经被added了导致的异常。
    FragmentActivity + Fragment + Fragment使用过程中出现的bug
    Android学习笔记之SoftReference软引用,弱引用WeakReference
  • 原文地址:https://www.cnblogs.com/jijm123/p/11468615.html
Copyright © 2011-2022 走看看