Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Убить DataSet [D4, MSSQL]


Страницы:   1 2

flider ©   (2002-07-12 13:09:00) 

Приветствую всех!
Есть проблема, может кто поможет.
В ходе работы приложения при выполнении поиска формируется SQL-ный запрос,
результатом работы которого является некий подобранный DataSet. Если после
этого опять выполняется поиск, то предыдущий DataSet закрывается, но не
уничтожается. Из-за этого после 3-7 крупных поисков происходит
переполнение памяти и приложение вешается.
Вопрос: можно ли каким-либо образом ликвидировать старый DataSet при
выполнении нового поиска, но чтобы при этом не вешалось приложени с
системой вместе.
Спасибо.


flider   (2002-07-15 12:57:00) [21]

А как можно уйти от BDE?


flider   (2002-07-14 14:12:00) [22]

Да, тут вспомнилась одна маленькая деталь - на предыдущей версии приложения (ее исходники были утеряны и пришлосьписать все заново) таких проблем не было. Работала она на той же BDE. Получается дело не в BDE-ях.


flider   (2002-07-14 13:36:00) [23]

BDE с 4 дельфей.
То есть программно точно не лечится?


Desdechado   (2002-07-13 15:28:00) [24]

а БДЕ какой версии?
может, поновее с борланда выкачать?


BAY   (2002-07-12 17:38:00) [25]

Хотя да, припоминаю. Такое было. Я думал я что-то не то делаю: каждые полчаса перезагружался. И действительно, когда перестал пользоваться BDE этой ошибки больше не было.


flider   (2002-07-12 16:22:00) [26]

Re: dimis
Как это грустно! У нас все именно с BDE и никак иначе. А может это все-таки лечится?


dimis   (2002-07-12 16:20:00) [27]

у меня тоже такое происходило
код
Query1.Close;
Query1.Open;
Query1.Close;
Query1.Open;
Query1.Close;
Query1.Open;
(обратите внимание многоточий нет)
достаточно быстро съедал всю память.
Query1.Free - тоже не помогало. После того как ушел от BDE все встало на свои места


flider   (2002-07-12 16:12:00) [28]

Кажется это этот кусок кода:
procedure TForm3.CreateQuery(Name: string);
begin
// Создание запроса поиска
Query1.SQL.Clear;
if (Lang.ParamRec.Params[5]=0) or (Lang.ParamRec.Params[5]=2) then
Query1.SQL.Add("delete from "+Name+"Buffer where AuditSessionID="+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(Lang.ParamRec.Params[5]));
Query1.SQL.Add("insert into "+Name+"Buffer (AuditSessionID, "+Name+"ID, SearchResult) ");
Query1.SQL.Add("select "+IntToStr(Lang.ParamRec.SessionID)+", "+Name+"ID, "+IntToStr(Lang.ParamRec.Params[5])+" from "+Name+" where ");
end;

function TForm3.GetBufferCount(Name: string): integer;
begin
// Определение количества записей в буфере
Query1.SQL.Clear;
Query1.SQL.Add("select Count(*) from "+Name+"Buffer where AuditSessionID="+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(SearchResult));
Query1.Open;
GetBufferCount:=Query1.Fields[0].AsInteger;
Query1.Close;
end;

procedure TForm3.CreateBegQuery(Name: string);
begin
// Формирование начала запроса для поиска в поиске
Query1.SQL.Clear;
Query1.SQL.Add("delete from "+Name+"Buffer where AuditSessionID= "+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(Lang.ParamRec.Params[5]));
Query1.SQL.Add("and "+Name+"ID not in (select "+Name+"ID from "+Name+" where ");
end;

procedure TForm3.CreateEndQuery(Name: string);
begin
// Формирование конца запроса для поиска в поиске
Query1.SQL.Add(")");
Query1.SQL.Add("and "+Name+"ID in (select "+Name+"ID from "+Name+"Buffer where AuditSessionID="+IntToStr(Lang.ParamRec.SessionID)+" and SearchResult="+IntToStr(Lang.ParamRec.Params[5])+")");
end;

procedure TForm3.ShowQueryRezult(Name: string; SortCond: string; RTabSheet, LTabSheet: TTabSheet; RQuery, LQuery: TQuery;
PageControl: TPageControl; RStatusBar, LStatusBar: TStatusBar; var SRCount, ListCount: integer);
var RecCount: integer;
begin
// Вывод на экран результатов поиска
Query1.ExecSQL;
if SearchResult>0 then
begin
SetSearchResult(2);
if LQuery.Active then LQuery.Close;
LQuery.SQL.Clear;
LQuery.SQL.Add("select * from V_"+Name);
if SortCond<>"" then LQuery.SQL.Add(SortCond);
LQuery.Open;
PageControl.ActivePage:=LTabSheet;
RecCount:=GetRecCount(LQuery);
ListCount:=RecCount;
LStatusBar.Panels[0].Text:="Количество записей: "+IntToStr(RecCount);
end
else
begin
SetSearchResult(0);
if RQuery.Active then RQuery.Close;
RQuery.SQL.Clear;
RQuery.SQL.Add("select * from V_"+Name);
if SortCond<>"" then RQuery.SQL.Add(SortCond);
RQuery.Open;
PageControl.ActivePage:=RTabSheet;
RecCount:=GetRecCount(RQuery);
SRCount:=RecCount;
RStatusBar.Panels[0].Text:="Количество записей: "+IntToStr(RecCount);
end;
end;


Nikolay M.   (2002-07-12 16:06:00) [29]


> Johnmen © (12.07.02 15:22)
>
> Вот только неясно, куда улетит запрос .... :)))))))))

Да, еще какой-нибудь DatabaseName указать не помешает :)


> flider (12.07.02 15:30)
> Re: Nikolay M.
> Там же не просто select, а с условиями, которые выбирает
> юзер.

Ну, куда же без пользователя?! :)
...
MyQuery.Text := "SELECT * FROM AnyTable WHERE UserName=" + #39 + Edit1.Text + #39;
...


fool   (2002-07-12 15:46:00) [30]

А ты под полученный набор данных случайно память не выделяешь(в какой нибудь класс или стринг лист не кидаешь, который потом освобождать надо)?


Johnmen   (2002-07-12 15:37:00) [31]

>flider (12.07.02 15:30)
>Re: Johnmen
>Просто Close просто закрывает, а в памяти все остается и через
>несколько запросов идет ошибка переполнения памяти.

Это говорит о глюкавости компонента доступа...

>Re: Nikolay M.
>Там же не просто select, а с условиями, которые выбирает юзер.

Ну формируй свой текст запроса, что мешает ?



flider   (2002-07-12 15:30:00) [32]

Re: Johnmen
Просто Close просто закрывает, а в памяти все остается и через несколько запросов идет ошибка переполнения памяти.

Re: Nikolay M.
Там же не просто select, а с условиями, которые выбирает юзер.

Re: Bay
Код кину чуть позже.


Johnmen   (2002-07-12 15:22:00) [33]

>Nikolay M. © (12.07.02 15:15)

Вот только неясно, куда улетит запрос .... :)))))))))


Nikolay M.   (2002-07-12 15:15:00) [34]


> А каким образом формировать DataSet руками?


MyQuery := TQuery.Create;
try
MyQuery.SQL.Text := "SELECT * FROM AnyTable";
MyQuery.Active := True;
.... // Действия после открытия НД
MyQuery.Active := False;
finally
MyQuery.Free;
end;


BAY   (2002-07-12 14:30:00) [35]

Ок. Я не видел с 3-го


BAY   (2002-07-12 14:29:00) [36]

Он должон ударяться. Кинь код.


Johnmen   (2002-07-12 14:24:00) [37]

просто Close для датасета


flider   (2002-07-12 14:17:00) [38]

"Закрывается, но не уничтожается" имеется в виду, что после команды QueryClose не высвобождается участок памяти, куда пишется результат выполнения запроса. Из-за этого, собственно, все проблемы.
А каким образом формировать DataSet руками? Там SQL-ный запрос, который формируется путем выбора пользователем параметров поиска.


Nikolay M.   (2002-07-12 14:03:00) [39]

Не совсем понял, что означает "закрывается, но не уничтожается", но что-то подсказывает, что можно попробовать этот злосчастный DataSet формировать руками динамически по Create/Free...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо