Delphi:对 MemTable 或其他类型的数据集执行 SQL 查询

Delphi: executing SQL queries on MemTable or other type of Dataset

我正在使用 Firedac 在本地 .db 文件上创建 SQL Lite 连接。我正在使用:

我想要的是从内存中的 SQLite 数据库文件中复制所有数据或表格,然后对其执行 SQL 查询。

我读到过我可以使用 mMemTable 或其他数据集,但所有与此相关的信息都比帮助我更令人困惑。

我想实现这一点,因为我必须 运行 "heavy" 查询(for 循环中的数千个查询),但不会牺牲太多速度和资源。目前我有 5 query.open("SELECT * ....") 在一个非常大的循环中,使我的代码非常慢。我想这源于许多 query.open() 东西。

如果我在内存中有一份 SQLite 数据的副本,然后 运行 查询该数据集,这将大大提高我的代码速度。

我已经在我的代码的另一部分实现了这个,我在排序列表中使用了从 SQLite 文件中获取的有限数量的数据,然后我遍历了我的列表。在那个大循环中替换 query.open() 后,性能提高了 300% 以上。

我不能使用与上述相同的方法,因为我想从我的 "SQL in Memory" 运行 SQL 查询中获取具有复杂条件的特定数据。

所以有人可以帮我解决上述问题吗?也许是关于此的 "clear" 小教程?


看来我的问题还没有得到解答。为了了解情况,我将尝试通过另一个代码示例更加具体。我仍在努力实现我上面所说的。我想从内存中的 SQLite 数据库复制数据,断开连接,然后 运行 SQLite 查询内存数据库。它应该与 TFDQuery、TFDLocalSQL、TFDConnection.

一起使用

我正在使用 "conn" 连接和 "query" 从 SQL 文件创建和获取数据。然后我激活

try
   // connection with local SQL file to fetch data from
   query.Connection := conn;
   query.Open('SELECT * FROM CAMPAIGNS');
   query.FetchAll();
   // I've put SQL text because FDQuery1 must me active and SQL text must be 
   // included
   FDQuery1.SQL.Text:='SELECT 1';
   FDQuery1.Active:= true;
   // the following line of code, is supposed to copy data and structure
   FDQuery1.CloneCursor(query,true,true);
finally
   conn.Close();
   query.Free();
   conn.Close();
end;
// it seems from showmessage that records exist inside TFDQuery
showmessage(FDQuery1.RecordCount.ToString);
// when I execute the following query, it tells that such table does not 
// exist
FDQuery1.Open('SELECT * FROM CAMPAIGNS');

您是否尝试过使用 data 属性 从表中加载数据?

FDQuery1.Open; FDQuery1.FetchAll; FDMemTable1.Data := FDQuery1.Data;

盲人领盲人的案例,我还在想办法, 但我认为您需要使用 TFDLocalSQL 作为 TFDMemTable 和 TFDQuery 之间的管道。有关更多信息,请尝试 http://docwiki.embarcadero.com/RADStudio/Rio/en/Local_SQL_(FireDAC)