Загрузить сразу все записи в TStringListDelphi , Компоненты и Классы , СпискиЗагрузить сразу все записи в TStringList
Оформил: DeeCo { 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. В коде есть два процедура: Процедура Процедура Однако, если у вас есть миллионы записей, загрузка всех сразу может быть не практичной или эффективной. Для более масштабного решения можно использовать cursorless-approach для загрузки данных из базы данных в приложение. В Delphi можно использовать компонент TSQLQuery для выполнения SQL-запросов, которые извлекают данные из базы данных и хранят их в TStringList. Вот пример кода:
В этом коде создается компонент TSQLQuery, устанавливается его строка соединения с базой данных и выполняется SQL-запрос, извлекающий данные из SourceTable. Затем перебирается каждый запись в результате, добавляя каждую запись'OriginalData'field в StringList. Этот подход более масштабный, потому что позволяет контролировать количество загружаемых данных одновременно, что может помочь предотвратить проблемы с памятью при работе с большими объемами данных. Загрузка миллионов записей в TStringList может быть очень медленной, но можно использовать хранимую процедуру SQL Server для быстрого формирования кэш-таблицы и последующего загрузки ее содержимого в TStringList. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |