Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.01.2012, 10:56
royun royun вне форума
Прохожий
 
Регистрация: 19.08.2011
Сообщения: 28
Репутация: 10
По умолчанию Потребление памяти

Добрый день.

У меня есть программа, которая передает данные из StringGrida в таблицу SQL Server 2000. Используется ADOConnection, ADODataSet. Для доступа к таблице. Передача данных идет следующим образом:

Код:
ADODataSet1['Date'] := StrToDateTime(StringGrid2.Cells[1, iRow]);
      ADODataSet1['AbonentA'] := StringGrid2.Cells[2, iRow];
      ADODataSet1['AbonentB'] := StringGrid2.Cells[3, iRow];
      ADODataSet1['Vremia'] := StringGrid2.Cells[4, iRow];
      ADODataSet1['Dlit'] := StringGrid2.Cells[5, iRow];
      ADODataSet1['Dlit_fakt'] := StringGrid2.Cells[6, iRow];
      ADODataSet1['Vh_trunk'] := StringGrid2.Cells[7, iRow];
      ADODataSet1['Ish_Trunk'] := StringGrid2.Cells[8, iRow];
      ADODataSet1['Prichina'] := StringGrid2.Cells[9, iRow];
      ADODataSet1['Zona'] := StringGrid2.Cells[10, iRow];

В свойствах ADODataSet CommandType стоит cmdStoredProc и в CommandText стоит имя хранимой процедуры sp1;1. А в хранимой процедуре команда:

Код:
CREATE PROCEDURE sp1 AS
select * from billing
GO
Сейчас в таблице порядка 8 млн. записей. Когда программу запускаешь, то программа подключается к таблице и считывает все 8 млн. записей и потом открывается. Проходит примерно 16 минут. Потребляет оперативной памяти около 1.5 Гб, SQL Server 2000 ограничил 500 Мб. После открытия программы потребление памяти начинает падать.

Проблема потребления памяти только на стадии открытия программы.

Как быть, посоветуйте пожалуйста.
Ответить с цитированием
  #2  
Старый 17.01.2012, 15:15
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

Ндя... это кто же придамал тащить на клиент 8 млн записей? Да и вообще зачем вам тянуть данные на клиент? вам же как я понимаю надо только записать их в базу.. или я чего-то не понимаю
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #3  
Старый 17.01.2012, 15:28
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Выставить для AdoDataset свойство CursorLocation := clUseServer
ПС: И кстати, а как в стринггрид данные попадают?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 17.01.2012 в 15:31.
Ответить с цитированием
  #4  
Старый 18.01.2012, 06:08
royun royun вне форума
Прохожий
 
Регистрация: 19.08.2011
Сообщения: 28
Репутация: 10
По умолчанию

Есть бинарный файл и есть его структура. Зная структуру файла считываем данные в StringGrid. Из StringGrid-а в таблицу SQL Server 2000 используя ADODataSet.

Настроил ADOConnection, в ADODataSet в свойствах Connection выбираю ADOConnection. Если я не заполню свойство ADODataSet CommandText, то когда свойство Active ставлю TRUE выходит ошибка "Missing command text property". Поэтому в свойстве CommandType ставлю cmdStoredProc и в CommandText пишу имя хранимой процедуры sp1;1, т.к. хранимые процедуры выполняются быстрее.

Вот и поэтому происходят тормоза в программе. Как это дело обойти можно?
Ответить с цитированием
  #5  
Старый 18.01.2012, 07:45
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вставлять данные через INSERT прямо в таблицу.
Ответить с цитированием
  #6  
Старый 18.01.2012, 12:20
royun royun вне форума
Прохожий
 
Регистрация: 19.08.2011
Сообщения: 28
Репутация: 10
По умолчанию

Все на само деле оказалось куда проще:

Код:
select * from billing
where npp='1'

И теперь не тащу на клиента 8 млн. записей. И все записи корректно переносятся в таблицу. Проверил.

Не ругайте, только начинаю.

Тема закрыта.
Ответить с цитированием
  #7  
Старый 18.01.2012, 14:52
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

зачем вообще делать select * from billing ? тебе же надо только делать insert
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter