Delphi 10.2:使用本地 SQL 和 Firedac 内存表
Delphi 10.2: Using Local SQL with Firedac Memory Tables
如何将 Firedac LocalSQL 与 FDMemtable 一起使用?有可用的工作示例吗?
根据 Embarcadero DocWiki 我建立了一个本地连接(使用 SQLite 驱动程序)、一个 LocalSQL 组件并将一些 Firedac 内存 table 连接到它。然后我连接了一个 FDQuery 并尝试查询内存 tables。但是查询总是 returns "table xyz not known" 即使我在 localSQL 数据集集合中为内存 table 设置了明确的数据集名称。
我怀疑我遗漏了 Embarcadero 文档中未包含的一些基本内容。如果有人遇到过这个问题 运行 我将不胜感激。
这是我不久前为此处的答案编写的一些代码,它是使用 LocalSQL
的独立示例,已在 D10.2(西雅图)中测试。它应该足以让你去。 Istr,让它工作的关键是 EMBA 文档中某处的注释,即 FD 的 LocalSQL 是基于 Sqlite 的,正如您所指出的。
procedure TForm3.CopyData2;
begin
DataSource2.DataSet := FDQuery1;
FDConnection1.DriverName := 'SQLite';
FDConnection1.Connected := True;
FDLocalSQL1.Connection := FDConnection1;
FDLocalSQL1.DataSets.Add(FDMemTable1);
FDLocalSQL1.Active := True;
FDQuery1.SQL.Text := 'select * from FDMemTable1 order by ID limit 5';
FDQuery1.Active := True;
FDMemTable1.Close;
FDMemTable1.Data := FDQuery1.Data;
end;
procedure TForm3.FormCreate(Sender: TObject);
var
i : integer;
MS : TMemoryStream;
begin
FDMemTable1.CreateDataSet;
for i := 1 to 10 do
FDMemTable1.InsertRecord([i, 'Row:' + IntToStr(i), 10000 - i]);
FDMemTable1.First;
// Following is to try to reproduce problem loading from stream
// noted by the OP, but works fine
MS := TMemoryStream.Create;
try
FDMemTable1.SaveToStream(MS, sfBinary);
MS.Position := 0;
FDMemTable1.LoadFromStream(MS, sfBinary);
finally
MS.Free;
end;
end;
如您所见,您可以在 SQL 中引用现有的 FireDAC 数据集,只需使用其组件名称即可。
如何将 Firedac LocalSQL 与 FDMemtable 一起使用?有可用的工作示例吗?
根据 Embarcadero DocWiki 我建立了一个本地连接(使用 SQLite 驱动程序)、一个 LocalSQL 组件并将一些 Firedac 内存 table 连接到它。然后我连接了一个 FDQuery 并尝试查询内存 tables。但是查询总是 returns "table xyz not known" 即使我在 localSQL 数据集集合中为内存 table 设置了明确的数据集名称。
我怀疑我遗漏了 Embarcadero 文档中未包含的一些基本内容。如果有人遇到过这个问题 运行 我将不胜感激。
这是我不久前为此处的答案编写的一些代码,它是使用 LocalSQL
的独立示例,已在 D10.2(西雅图)中测试。它应该足以让你去。 Istr,让它工作的关键是 EMBA 文档中某处的注释,即 FD 的 LocalSQL 是基于 Sqlite 的,正如您所指出的。
procedure TForm3.CopyData2;
begin
DataSource2.DataSet := FDQuery1;
FDConnection1.DriverName := 'SQLite';
FDConnection1.Connected := True;
FDLocalSQL1.Connection := FDConnection1;
FDLocalSQL1.DataSets.Add(FDMemTable1);
FDLocalSQL1.Active := True;
FDQuery1.SQL.Text := 'select * from FDMemTable1 order by ID limit 5';
FDQuery1.Active := True;
FDMemTable1.Close;
FDMemTable1.Data := FDQuery1.Data;
end;
procedure TForm3.FormCreate(Sender: TObject);
var
i : integer;
MS : TMemoryStream;
begin
FDMemTable1.CreateDataSet;
for i := 1 to 10 do
FDMemTable1.InsertRecord([i, 'Row:' + IntToStr(i), 10000 - i]);
FDMemTable1.First;
// Following is to try to reproduce problem loading from stream
// noted by the OP, but works fine
MS := TMemoryStream.Create;
try
FDMemTable1.SaveToStream(MS, sfBinary);
MS.Position := 0;
FDMemTable1.LoadFromStream(MS, sfBinary);
finally
MS.Free;
end;
end;
如您所见,您可以在 SQL 中引用现有的 FireDAC 数据集,只需使用其组件名称即可。