| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Занесение результата запроса в массив |
| Автор: Lunatikus 11.12.2007, 13:37 |
| Здравствуйте. Подскажите,возможно ли результат запроса(база MS SQL 2000,ADOQuery) занести в массив данных без использования перебора с помощью Next? Слишком уж длительным становится выполнение некста даже по 1млн. записей,поэтому хочу занести сначала данные в массив и перебирать их там. |
| Автор: Deniz 12.12.2007, 08:59 |
| Lunatikus, делай однонаправленный курсор. длительно не Next, а выбор и пересылка записей от сервера к клиенту (1 млн Без Next скорее всего не обойтись. А ты уверен, что будет быстрее чем ADOQuery? Может тогда обработку на сервере в процедуре сделать? |
| Автор: Vas 12.12.2007, 11:07 |
| А для чего их перебирать, может стоит условие перебора сразу в запрос воткнуть и выбрать только те записи что нужны. Ну а ежели все обработать надо по-любому, то процедура на сервере и вперед, в этом и плюс сервера, что не надо таскать записи по сети, которая является самой медленной частью передачи данных, сервер обработает сам все и намного быстрее. |
| Автор: Lunatikus 12.12.2007, 13:39 |
| хм.Спасибо за разъяснения.Это получается,что клиент получил результат выборки.Далее он запрашивает некст и сервер снова пересылает данные?Я думал,что клиент работает с тем,что получил. Ну если так,то буду делать процедуру на сервере. |
| Автор: Deniz 13.12.2007, 06:32 |
| Lunatikus, не совсем правильно понял. Клиент послал запрос на сервер и получил ответ (возможно была ошибка и т.д.). Сервер пересылает метаданные по запросу(поля, типы и т.д.) Клиент запрашивает порцию данных (в зависимости от компонент и настроек 1, порция или все записи) Далее Next двигает указатель по локальному набору на клиенте, если указатель дошел до конца локального набора, то запрашивается следующая порция с сервера и так до тех пор, пока не прочитаются все записи с сервера по заданному запросу. И это (все считанные записи с сервера) хранится на клиенте в памяти/на диске - кто как умеет. Если в клиенте выставить свойство однонаправленности, то на клиенте будет только 1 запись и Next, забрав следующую запись, перепишет ее поверх текущей, т.о. нельзя перейти на предыдущую запись, но сильно экономится память и возрастает скорость обработки. Немного сумбурно описал, но ... я думаю будет понятно. |
| Автор: Lunatikus 13.12.2007, 14:13 |
| Какими средствами выставляется однонаправленность? |
| Автор: Deniz 14.12.2007, 07:23 | ||
| TADOQuery.CursorType Из справки:
PS: так же смотри CursorLocation и LockType возможно еще немного помогут. PSS: не зная толком задачи можно насоветовать много чего, например:
|