![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Убить DataSet [D4, MSSQL]
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...