Delphi XE6 FireDAC - 将 TFDQuery 记录集导出到 JSON
Delphi XE6 FireDAC - Export TFDQuery recordset to JSON
我在 Delphi XE6 中使用 FireDAC 通过 ODBC 查询数据库 (Pervasive)。我有一个 TFDQuery 组件,它运行我的 SELECT 查询和 returns 记录。查询完成后,我想将记录集中的数据导出为 JSON。我试过使用以下代码:
fdacQuery.SaveToStream(myStream, sfJSON);
这会创建 JSON,但仅用于 table 定义,即字段名称、数据类型、约束等 - 没有数据表示。我应该使用另一种方法将记录集数据导出为 JSON 吗?还有其他解决方案吗?
你看过 http://docwiki.embarcadero.com/RADStudio/XE8/en/Tutorial:_Using_a_REST_DataSnap_Server_with_an_Application_and_FireDAC 教程中的代码了吗?
// Create dataset list
Result := TFDJSONDataSets.Create;
// Add departments dataset
TFDJSONDataSetsWriter.ListAdd(Result, sDepartment, FDQueryDepartment);
// Add employees dataset
TFDJSONDataSetsWriter.ListAdd(Result, sEmployees, FDQueryDepartmentEmployees);
那就试试这件尺码吧。我这样做是为了昨天需要的实用程序。它使用超对象。我在代码中保留了所有字段类型,以防您想添加其他特殊处理或调整我输入的任何字段类型。它现在在许多随机数据集上为我工作。
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;
我在 Delphi XE6 中使用 FireDAC 通过 ODBC 查询数据库 (Pervasive)。我有一个 TFDQuery 组件,它运行我的 SELECT 查询和 returns 记录。查询完成后,我想将记录集中的数据导出为 JSON。我试过使用以下代码:
fdacQuery.SaveToStream(myStream, sfJSON);
这会创建 JSON,但仅用于 table 定义,即字段名称、数据类型、约束等 - 没有数据表示。我应该使用另一种方法将记录集数据导出为 JSON 吗?还有其他解决方案吗?
你看过 http://docwiki.embarcadero.com/RADStudio/XE8/en/Tutorial:_Using_a_REST_DataSnap_Server_with_an_Application_and_FireDAC 教程中的代码了吗?
// Create dataset list
Result := TFDJSONDataSets.Create;
// Add departments dataset
TFDJSONDataSetsWriter.ListAdd(Result, sDepartment, FDQueryDepartment);
// Add employees dataset
TFDJSONDataSetsWriter.ListAdd(Result, sEmployees, FDQueryDepartmentEmployees);
那就试试这件尺码吧。我这样做是为了昨天需要的实用程序。它使用超对象。我在代码中保留了所有字段类型,以防您想添加其他特殊处理或调整我输入的任何字段类型。它现在在许多随机数据集上为我工作。
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;