Хранение массива в BLOB-поле
Var
aData: Array of Integer;
Процедура записи динамического массива в базу данных получилась примерно такая:
Var
ms: TMemoryStream;
…
begin
…
Try
ms := TMemoryStream.Create;
// Запись содержимого массива aData в поток ms
ms.WriteBuffer(aData[0], Length(aData) * SizeOf(aData[0]));
// Запись содержимого потока ms в параметр query для вставки данных
qInsertResearch.Params[5].LoadFromStream(ms, ftBlob);
Finally
ms.Free;
End;
…
А процедура чтения массива из базы данных не сложнее процедуры записи:
Var
ms: TMemoryStream;
…
begin
…
Try
ms := TMemoryStream.Create;
// Запись содержимого поля qResearchDATA типа TBlobField в поток ms
qResearchDATA.SaveToStream(ms);
// Установка размера динамического массива aData
SetLength(aData, ms.Size div SizeOf(aData[0]));
ms.Position := 0;
// Запись содержимого потока ms в массив aData
ms.ReadBuffer(aData[0], ms.Size);
Finally
ms.Free;
End;
…
Теперь на запись/чтение нескольких миллионов записей моя программа тратит секунду. Вместо размера первого элемента массива SizeOf(aData[0]) вы можете использовать размер типа элементов массива (для приведенного мной примера — SizeOf(Integer)). Но такой вариант кода будет менее универсальным, т.к. будет зависеть от используемого типа данных.
P.S. При использовании такого способа хранения данных не забывайте, что размер некоторых типов данных зависит от операционной системы, для которой скомпилирована программа. Иначе информация, которую прочтет из базы данных ваша 64-битная программа перекомпилированная из 32-битной, вас неприятно удивит.