Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Загрузить сразу все записи в TStringList

Delphi , Компоненты и Классы , Списки

Загрузить сразу все записи в TStringList

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ Loading millions of records into a stringlist can be very slow }

 procedure TForm1.SlowLoadingIntoStringList(StringList: TStringList);
 begin
   StringList.Clear;
   with SourceTable do
   begin
     Open;
     DisableControls;
     try
       while not EOF do
       begin
         StringList.Add(FieldByName('OriginalData').AsString);
         Next;
       end;
     finally
       EnableControls;
       Close;
     end;
   end;
 end;

 { This is much, much faster }
 procedure TForm1.QuickLoadingIntoStringList(StringList: TStringList);
 begin
   with CacheTable do
   begin
     Open;
     try
       StringList.Text := FieldByName('Data').AsString;
     finally
       Close;
     end;
   end;
 end;

 { How can this be done? 

  In Microsoft SQL Server 7, you can write a stored procedure that updates every night 
  a cache table that holds all the data you want in a single column and row. 
  In this example, you get the data from a SourceTable and put it all in a Cachetable. 
  The CacheTable has one blob column and must have only one row. 
  Here it is the SQL code: }


 Create Table CacheTable
 (Data Text NULL)
 GO

 Create

  procedure PopulateCacheTable as
   begin
   set NOCOUNT on
   DECLARE @ptrval binary(16), @Value varchar(600) -
   - a good Value for the expected maximum Length
   - - You must set 'select into/bulkcopy' option to True in order to run this sp
   DECLARE @dbname nvarchar(128)
   set @dbname = db_name()
 EXEC sp_dboption @dbname, 'select into/bulkcopy', 'true'
 - - Declare a cursor
 DECLARE scr CURSOR for
 SELECT  OriginalData + char(13) + char(10) - - each line in a TStringList is
 separated by a #13#10
FROM   SourceTable
 - - The CacheTable Table must have only one record
 if EXISTS (SELECT * FROM CacheTable)
 Update CacheTable set Data = ''
 else
 Insert CacheTable VALUES('')
 - - Get a Pointer to the field we want to Update
 SELECT @ptrval = TEXTPTR(Data) FROM CacheTable

 Open scr
 FETCH Next FROM scr INTO @Value
 while @ @FETCH_STATUS = 0
 begin - - This UPDATETEXT appends each Value to the
  end
  of the blob field
 UPDATETEXT CacheTable.Data @ptrval NULL 0 @Value
 FETCH Next FROM scr INTO @Value
 end
 Close scr
 DEALLOCATE scr
 - - Reset this option to False
 EXEC sp_dboption @dbname, 'select into/bulkcopy', 'false'
 end
 GO

 { You may need to increase the BLOB SIZE parameter if you use BDE }

Пример кода, демонстрирующий загрузку данных из таблицы базы данных в TStringList в Delphi. В коде есть два процедура: SlowLoadingIntoStringList и QuickLoadingIntoStringList.

Процедура SlowLoadingIntoStringList загружает данные, перебирая каждый запись в SourceTable, добавляя каждую запись в StringList, а затем закрывает соединение с базой данных.

Процедура QuickLoadingIntoStringList использует другой подход. Она открывает CacheTable, читает ее содержимое в свойство Text StringList, и затем закрывает соединение с базой данных. Это быстрее, потому что не требует перебора индивидуальных записей.

Однако, если у вас есть миллионы записей, загрузка всех сразу может быть не практичной или эффективной.

Для более масштабного решения можно использовать cursorless-approach для загрузки данных из базы данных в приложение. В Delphi можно использовать компонент TSQLQuery для выполнения SQL-запросов, которые извлекают данные из базы данных и хранят их в TStringList.

Вот пример кода:

var
  Query: TSQLQuery;
begin
  Query := TSQLQuery.Create(nil);
  try
    Query.Connection := MyConnection; // Замените на ваше актуальное соединение
    Query.SQL.Add("SELECT OriginalData FROM SourceTable");
    Query.Open;

    StringList.Clear;
    while not Query.Eof do begin
      StringList.Add(Query.FieldByName('OriginalData').AsString);
      Query.Next;
    end;
  finally
    FreeAndNil(Query);
  end;
end;

В этом коде создается компонент TSQLQuery, устанавливается его строка соединения с базой данных и выполняется SQL-запрос, извлекающий данные из SourceTable. Затем перебирается каждый запись в результате, добавляя каждую запись'OriginalData'field в StringList.

Этот подход более масштабный, потому что позволяет контролировать количество загружаемых данных одновременно, что может помочь предотвратить проблемы с памятью при работе с большими объемами данных.

Загрузка миллионов записей в TStringList может быть очень медленной, но можно использовать хранимую процедуру SQL Server для быстрого формирования кэш-таблицы и последующего загрузки ее содержимого в TStringList.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Списки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-08 18:02:44/0.00382399559021/0