捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:FDMemTable.Delta 转SQL语句脚本
cocoddgzs 604134 2020/7/24 9:56:22
没有返回值
zxg8390 592373 2018/5/4 0:31:40
这个里面有点小问题,不知道发布者自己到底调试了没有,还是直接拷贝。
现将修正后能完全通过的给到大家。
function DBToJSON(DB: TFDMemTable; sTable: string; sKey: string; sNoField: string): string;
var
  ItemKey, ItemNoField: TStringlist;
  JA: TJSONArray;
  Jvalue :TJSONValue;
  sField, sValue, sSQL, sTmp, sName,formatkey: string;
  i, j: Integer;
begin
  JA := TJSONArray.Create;
  ItemKey := TStringlist.Create;
  ItemNoField := TStringlist.Create;

  ItemKey.Delimiter := ',';
  ItemKey.DelimitedText := sKey;

  ItemNoField.Delimiter := ',';
  ItemNoField.DelimitedText := sNoField;

  sField := ';
  sValue := ';
  sSQL := ';
  with DB.Delta.DataView.Rows do
  begin
    for I := 0 to Count - 1 do
    begin
         sField := ';
         sValue := ';
         sSQL := ';
      //判断数据的操作状态 :插入
      if ItemsI[i].RowState = TFDDatSRowState.rsInserted then
      begin

        //循环对应的数据字段
        for j := 0 to DB.Fields.Count - 1 do
        begin
          //获取字段名称
          sName := DB.Fields[J].FieldName;

          //排除不需要插入的字段信息
          if ItemNoField.IndexOf(sName) > -1 then
          Continue;

          //判断字段的数据类型
          case DB.Fields[J].DataType of
          ftString, ftWideString, ftMemo:
          sTmp := VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
          ftSmallint, ftInteger, ftFloat, ftCurrency, ftBCD:
          sTmp := VarToStr(ItemsI[i].GetValues(sName));
          ftDateTime:
          begin
          sTmp := VarToStr(ItemsI[i].GetValues(sName));
          //日期如何没有填写默认为Null
          if sTmp = ' then
          sTmp := 'Null'
          else
          sTmp := FormatDateTime('yyyy-mm-dd hh:ss:mm', StrToDateTime(sTmp)).QuotedString;
          end;
          ftBoolean:
          begin
          if ItemsI[i].GetValues(sName) = True then
          sTmp := '1'
          else
          sTmp := '0';
          end;
          else
          sTmp := VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
          end;

          //累积字段和插入值
          sField := sField + sName + ',';
          sValue := sValue + sTmp + ',';
        end;
        //拼接成SQL并插入到数组中
        JA.Add('Insert Into ' + sTable + ' (' + Copy(sField, 1, Length(sField) - 1) + ')' + #13#10 + ' Values(' + Copy(sValue, 1, Length(sValue) - 1) + ')' + #13#10);

      end
      //判断数据的操作状态 :修改
      else if ItemsI[i].RowState in [TFDDatSRowState.rsModified, TFDDatSRowState.rsEditing] then
      begin

        for j := 0 to DB.Fields.Count - 1 do
        begin
          sName := DB.Fields[J].FieldName;

          //排除不需要插入的字段信息
          if ItemNoField.IndexOf(sName) > -1 then
          Continue;


          //判断字段的数据类型
          case DB.Fields[J].DataType of
          ftString, ftWideString, ftMemo:
          sTmp := VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
          ftSmallint, ftInteger, ftFloat, ftCurrency, ftBCD:
          sTmp := VarToStr(ItemsI[i].GetValues(sName));
          ftDateTime:
          begin
          sTmp := VarToStr(ItemsI[i].GetValues(sName));
          if sTmp = ' then
          sTmp := 'Null'
          else
          sTmp := FormatDateTime('yyyy-mm-dd hh:ss:mm', StrToDateTime(sTmp)).QuotedString;
          end;
          ftBoolean:
          begin
          if ItemsI[i].GetValues(sName) = True then
          sTmp := '1'
          else
          sTmp := '0';
          end;
          else
          sTmp := VarToStr(ItemsI[i].GetValues(sName)).QuotedString;
          end;
          //累积更新字段值
          sField := sField + sName + '=' + sTmp + ',';


          if ItemKey.IndexOf(sName) > -1 then
          case DB.Fields[J].DataType of
          ftString, ftWideString, ftMemo:
          formatkey := VarToStr(ItemsI[i].GetData(sName,rvOriginal)).QuotedString;
          ftSmallint, ftInteger, ftFloat, ftCurrency, ftBCD:
          formatkey := VarToStr(ItemsI[i].GetData(sName,rvOriginal));
          ftDateTime:
          begin
          formatkey := VarToStr(ItemsI[i].GetData(sName,rvOriginal));
          if formatkey = ' then
          formatkey := 'Null'
          else
          formatkey := FormatDateTime('yyyy-mm-dd hh:ss:mm', StrToDateTime(formatkey)).QuotedString;
          end;
          ftBoolean:
          begin
          if ItemsI[i].GetData(sName,rvOriginal) = True then
          formatkey := '1'
          else
          formatkey := '0';
          end;
          else
          formatkey := VarToStr(ItemsI[i].GetData(sName,rvOriginal)).QuotedString;
          end;


          //修改数据关键字段,条件值
          if ItemKey.IndexOf(sName) > -1 then
//          sSQL := sSQL + ' And ' + sName + ' = ' + VarToStr(ItemsI[i].GetData(sName, rvOriginal)); //原来的值
//          //这一句有问题,没能判断原来值的数据类型,导致出错
          sSQL := sSQL + ' And ' + sName + ' =  ' + formatkey ;
        end;
        //拼接成SQL并插入到数组中
        JA.Add('Update ' + sTable + ' Set ' + Copy(sField, 1, Length(sField) - 1) + ' Where ' + Copy(sSQL, 5, Length(sSQL)));
      end
      else if ItemsI[i].RowState in [TFDDatSRowState.rsDeleted] then
      begin
        sSQL := ';
        //删除数据关键字段,条件值
        for J := 0 to ItemKey.Count - 1 do
        begin
          sValue := ItemsI[i].GetValues(ItemKey.Strings[j]);
          if sValue.Trim <> ' then
          sSQL := sSQL + ' And ' + ItemKey.Strings[j] + ' = ' + QuotedStr(sValue.Trim);
        end;

        //拼接成SQL并插入到数组中
        if sSQL <> ' then
          JA.Add('Delete from ' + sTable + ' Where ' + Copy(sSQL, 5, Length(sSQL)));
      end;
    end;
  end;
 //Result := JA.ToString;
 for Jvalue in JA  do
      Result:=Result+ '; '+jvalue.Value;
      Result:=Copy(Result,2);
  FreeAndNil(JA);
  FreeAndNil(ItemKey);
  FreeAndNil(ItemNoField);
end;
sunly 585017 2016/9/3 19:06:40
看代码应该是不错,但在我这里执行没有返回值,跟踪了一下,修改数据后,FDMemTable1.delta属性是空的,但如果修改CDS,其delta属性是有数据的,不知道是我电脑原因还是怎么了
第一页 上一页 下一页 最后页 有 3 条纪录 共1页 1 - 3
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表