Delphi:对 MemTable 或其他类型的数据集执行 SQL 查询
Delphi: executing SQL queries on MemTable or other type of Dataset
我正在使用 Firedac 在本地 .db 文件上创建 SQL Lite 连接。我正在使用:
- TFDConnection:创建连接对象
- TFDQuery:执行我的 SQLite 查询。
我想要的是从内存中的 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)
我正在使用 Firedac 在本地 .db 文件上创建 SQL Lite 连接。我正在使用:
- TFDConnection:创建连接对象
- TFDQuery:执行我的 SQLite 查询。
我想要的是从内存中的 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)