Delphi: выполнение SQL-запросов к MemTable или другому типу набора данных - PullRequest
0 голосов
/ 13 сентября 2018

Я использую Firedac для создания соединения SQL Lite на локальном файле .db.Я использую:

  • TFDConnection: для создания объекта подключения
  • TFDQuery: для выполнения моих запросов SQLite.

Мне нужно скопировать все данныеили таблицы из моего файла базы данных SQLite в памяти, а затем выполнить SQL-запросы к нему.

Я читал, что могу использовать mMemTable или другие наборы данных, но вся информация, касающаяся этого, более запутана, чем выручает меня.

Я хочу добиться этого, потому что мне приходится выполнять «тяжелые» запросы (тысячи запросов внутри цикла for), но не жертвуя такой большой скоростью и ресурсами.В настоящее время у меня есть 5 query.open ("SELECT * ....") внутри очень большого цикла, что делает мой код очень медленным.Я предполагаю, что это происходит от многих вещей query.open ().

Если у меня есть копия моих данных SQLite в памяти, а затем я выполняю запросы к этому набору данных, это резко увеличит скорость моего кода.

Я реализовал это в другой части моего кода, где я использовал ограниченный объем данных, взятых из файла SQLite в отсортированных списках, а затем перебрал свои списки.Производительность увеличилась более чем на 300% после замены query.open () внутри этого большого цикла.

Я не могу использовать тот же метод, что и упомянутый выше, потому что я хочу запускать SQL-запросы из моего «SQL in Memory» для извлечения определенныхданные со сложными критериями.

Так кто-нибудь может помочь мне с вышеуказанным вопросом?Может быть, небольшой и "понятный" учебник по этому поводу?


Кажется, что на мой вопрос до сих пор нет ответа.Я попытаюсь быть более конкретным с другим примером кода, чтобы понять ситуацию.Я все еще пытаюсь достичь того, что я говорил выше.Я хочу скопировать данные из моей базы данных SQLite в память, отключить, а затем выполнить запросы SQLite в базе данных памяти.Предполагается, что он будет работать с TFDQuery, TFDLocalSQL, TFDConnection.

Я создаю и извлекаю данные из файла SQL, используя соединение "conn" и "запрос".Тогда я активирую

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');

1 Ответ

0 голосов
/ 14 сентября 2018

Вы пытались загрузить данные из ваших таблиц с помощью свойства data?

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

...