Delphi XE6 FireDAC - Export TFDQuery recordset to JSON
我在Delphi XE6中使用FireDAC通过ODBC查询数据库(普及)。我有一个TFDQuery组件,该组件运行SELECT查询并返回记录。查询完成后,我想将记录集中的数据导出为JSON。我尝试使用以下代码:
1 | fdacQuery.SaveToStream(myStream, sfJSON); |
这将创建JSON,但仅用于表定义,即字段名称,数据类型,约束等-没有数据表示。我应该使用另一种方法将记录集数据导出为JSON吗?还有其他解决方案吗?
然后尝试一下以获取尺寸。我是为昨天需要的实用程序而做的。它使用SuperObject。我将所有字段类型保留在代码中,以防您想添加其他特殊处理或调整我放入的任何其他处理。它现在对许多随机数据集都有效。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | class procedure TTool.ExportDataSetToJson(DataSet: TDataSet; FileName: string; Append: boolean = false); const SData = 'data'; var json : ISuperObject; item : ISuperObject; wasActive: boolean; fld : TField; begin json := SO; json.O[SData] := SA([]); wasActive := DataSet.Active; try DataSet.Active := true; DataSet.First; while not DataSet.Eof do begin item := SO; for fld in DataSet.Fields do begin case fld.DataType of // ftUnknown: ; ftString, ftBlob, ftMemo, ftFmtMemo, ftBytes, ftVarBytes, ftFixedChar, ftFixedWideChar, ftWideMemo, ftByte, ftWideString: item.S[fld.FieldName] := fld.AsString; ftBoolean: item.B[fld.FieldName] := fld.AsBoolean; ftFloat, ftSingle, ftExtended, ftCurrency, ftFMTBcd, ftBCD: item.D[fld.FieldName] := fld.AsFloat; ftTime : item.S[fld.FieldName] := TimeToJson(fld.AsDateTime); ftDate, ftTimeStamp, ftOraTimeStamp, ftDateTime: item.S[fld.FieldName] := DateTimeToJson(fld.AsDateTime); ftSmallint, ftInteger, ftWord, ftAutoInc, ftLongWord, ftShortint, ftLargeInt: item.I[fld.FieldName] := fld.AsLargeInt; // ftGraphic: ; // ftParadoxOle: ; // ftDBaseOle: ; // ftTypedBinary: ; // ftCursor: ; // ftADT: ; // ftArray: ; // ftReference: ; // ftDataSet: ; // ftOraBlob: ; // ftOraClob: ; // ftVariant: ; // ftInterface: ; // ftIDispatch: ; ftGuid: item.S[fld.FieldName] := fld.AsString; // ftOraInterval: ; // ftConnection: ; // ftParams: ; // ftStream: ; // ftTimeStampOffset: ; // ftObject: ; else item.S[fld.FieldName] := fld.AsString; end; end; DataSet.Next; json.A[SData].Add(item); end; if Append then TFile.AppendAllText(FileName, json.AsJSon(true, true)) else json.SaveTo(FileName, true, true); finally DataSet.Active := wasActive; end; end; |
您是否看过本教程中的代码,网址为http://docwiki.embarcadero.com/RADStudio/XE8/en/Tutorial:_Using_a_REST_DataSnap_Server_with_an_Application_and_FireDAC了吗?
1 2 3 4 5 6 | // Create dataset list Result := TFDJSONDataSets.Create; // Add departments dataset TFDJSONDataSetsWriter.ListAdd(Result, sDepartment, FDQueryDepartment); // Add employees dataset TFDJSONDataSetsWriter.ListAdd(Result, sEmployees, FDQueryDepartmentEmployees); |