这个里面有点小问题,不知道发布者自己到底调试了没有,还是直接拷贝。 现将修正后能完全通过的给到大家。 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; |