Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.05;
Скачать: CL | DM;

Вниз

Убить DataSet   Найти похожие ветки 

 
flider   (2002-07-12 13:09) [0]

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


 
Nikolay M. ©   (2002-07-12 14:03) [1]

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


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

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


 
Johnmen ©   (2002-07-12 14:24) [3]

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


 
BAY ©   (2002-07-12 14:29) [4]

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


 
BAY ©   (2002-07-12 14:30) [5]

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


 
Nikolay M. ©   (2002-07-12 15:15) [6]


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


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


 
Johnmen ©   (2002-07-12 15:22) [7]

>Nikolay M. © (12.07.02 15:15)

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


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

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

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

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



 
Johnmen ©   (2002-07-12 15:37) [9]

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

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

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

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




 
fool ©   (2002-07-12 15:46) [10]

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


 
Nikolay M. ©   (2002-07-12 16:06) [11]


> 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;
...


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

Кажется это этот кусок кода:
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;


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

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


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

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


 
BAY ©   (2002-07-12 17:38) [15]

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


 
Desdechado ©   (2002-07-13 15:28) [16]

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


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

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


 
flider   (2002-07-14 14:12) [18]

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


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

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


 
sniknik ©   (2002-07-15 13:45) [20]

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

EXEC sp_addlinkedserver
@server = "MYDBFs",
@provider = "Microsoft.Jet.OLEDB.4.0",
@srvproduct = "OLE DB Provider for Jet",
@datasrc = "D:\Base",
@provstr = "dBASE IV"

DECLARE @i int
SET @i = 1
WHILE @i < 1000 BEGIN
IF EXISTS (SELECT * FROM sysobjects WHERE (name = N"CashSail"))
BEGIN
INSERT INTO CashSail
SELECT * FROM mydbfs...CashSail
END ELSE BEGIN
SELECT * INTO CashSail
FROM mydbfs...CashSail
CREATE INDEX CashIndex ON CashSail (CashNumber)
CREATE INDEX ZIndex ON CashSail (ZNumber)
END
SET @i = @i + 1
PRINT @i
END

при выполнении в Querry Analizer-е виснет изза нехватки памяти на ~ 900-м запросе
с ошибкой
Server: Msg 7399, Level 16, State 1, Line 6
OLE DB provider "Microsoft.Jet.OLEDB.4.0" reported an error. The provider did not give any information about the error.

это мне вылечить не удалось. линк через ODBC работает нормально.
(уйдеш от BDE и попадеш в другую ж...у, уууу :-)


 
roottim   (2002-07-15 13:50) [21]

а причем тут Jet


 
sniknik ©   (2002-07-15 13:52) [22]

ни при чем. просто уходя от одних гемороев обычно попадаеш в другие.


 
Johnmen ©   (2002-07-15 13:56) [23]

Как же у вас, поклонников MSSQL, всё запущено...:)))))


 
roottim   (2002-07-15 13:58) [24]

я к тому что SP написана для MSSQL
к нему oledb for sqlserver..
а накой тут jet!


 
sniknik ©   (2002-07-15 14:04) [25]

Johnmen ©
Точно. Всем!!! переходите на Pervasive, вот где я проблем не встречал (глобальных). а с sql вообще просто что написал то и получиш. и ошибки только описанные в доках получаются :-).

а вообще извиняюсь за то что сбил с темы %-(


 
flider   (2002-07-15 14:31) [26]

Не, это не тот случай. Здесь просто нет закрытия процедуры,пока она не будет полностью выполнена, а запрос весьма приличный и на каждой машине,в зависимости от параметров, будет срываться на разных повторах, а на крутой машине выполнится полностью.
У нас ситуация иная - запросы-то в программе закрываются Close-ом, и, теоретически, должны полностью уничтожаться по закрытии. Но этого не происходит. Они продолжают где-то висеть в памяти.
И потом, хранимые процедуры SQL одни и те же в современной и в старой версии приложения, различия только в дельфячьей оболочке. И в старой версии все работает, а в новой - рушится.


 
Johnmen ©   (2002-07-15 14:45) [27]

Дельфи - не оболочка, а средство разработки. Поэтому дело не в Дельфях.


 
flider   (2002-07-15 14:58) [28]

Re: Johnmen
Я имела в виду оболочка - приложение, сделанное в дельфях, для работы со SQL-ной базой.
Все-таки дело именно в дельфячьем коде, а не в SQL-ном, поскольку, повторюсь, хранимые процедуры не менялись, в отличие от того, что было написано в Дельфях.


 
Johnmen ©   (2002-07-15 15:06) [29]

И версия MSSQL не менялась ?
И драйвера(прослойки) доступа не менялись ?


 
flider   (2002-07-15 15:10) [30]

Нет, ПО все то же самое, что и на старой версии.


 
Johnmen ©   (2002-07-15 15:22) [31]

Позволь тебе не поверить. :)
Меняя версию Дельфей ты меняла версию прокладки - BDE.


 
flider   (2002-07-15 15:27) [32]

Я не меняла версию дельфей. Как были 4 с одного и того же диска, так и ставили.


 
Johnmen ©   (2002-07-15 15:37) [33]

Тем не менее, если ничего, кроме самой программы (кода) не менялось, то это проблема не Дельфей !!!


 
flider   (2002-07-15 15:45) [34]

А чего? Мне казалось, что если было что-то написано и оно работало, потом было утеряно, а потом попытались восстановить, но оно не работает, то дело именно в коде - не так воспроизвели. Самое обидное, что восстанавливаем-то уже почти два года. Это была практически окончательная версия, и вдруг такая хрень выплыла. Надо что-то делать, а что - непонятно.


 
fool ©   (2002-07-15 17:47) [35]

Послушал я вас всех: даже не знаю че думать(а пока слушал делал Close - Open). Так вот у меня MDIForm делала себе MDIChild-а раз сорок(потом ему caFree), каждый раз тянулся запрос (около 2М), при Show - открывал нужные Query(14 шт.), а при Close - закрывал(вручную все по порядку). Mem Usege после процедуры Open-Close оставался одинаков (+- 4К). Все через BDE (MSSQL). Так что думаю дело не в BDE.

Делал так:

procedure OpenQueries;
begin
if not Q1.Active then Q1.Open;
...
if not Q14.Active then Q14.Open;
end;

procedure CloseQueries;
begin
if Q1.Active then Q1.Close;
....
if Q14.Active then Q14.Close;
end;


 
flider   (2002-07-15 17:57) [36]

Re: fool

Интересная мысль! Дело в том, что у нас используется не MDI-схема. Может быть дело в этом? Если перейти на MDI все заработает? Какова вероятность этого?


 
fool ©   (2002-07-15 18:27) [37]

Вероятность есть, но при использовании MDI тоже внимательно следи за высвобождением ресурсов, я использую такую схему:
/// Ето по некоему событию в папе
if MDIFrm = nil then MDIFrm := TMDIFrm.Create(self);
MDIFrm.WindowState := wsMaximized;
MDIFrm.Show;
/// А ето в чилде
procedure TMDIFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MDIFrm.CloseQueries;
Action := CaFree;
end;

procedure TMDIFrm.FormShow(Sender: TObject);
begin
MDIFrm.OpenQueries;
end;

procedure TMDIFrm.FormDestroy(Sender: TObject);
begin
MDIFrm := nil;
end;

procedure TFrmAgree.OpenQueries;
begin
end;

procedure TFrmAgree.CloseQueries;
begin
end;


 
fool ©   (2002-07-15 18:29) [38]

Извините, опечатка (не FrmAgree, а MDIFrm)


 
flider   (2002-07-15 19:04) [39]

Re: fool
Спасибо! А вот такой вопрос: у нас не используется уничтожение формы. Схема такая - SpeedButton на родительской форме, а под ними TabControl (или PageControl, не знаю) - на дочерней. На первой закладке пользователь может задавать параметры поиска. После нажатия на кнопку "Поиск", результат поиска выводится на вторую закладку. При повторном нажатии на Поиск, управлять очисткой памяти будет родительская форма?



Страницы: 1 вся ветка

Текущий архив: 2002.08.05;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.008 c
14-13793
Феликс
2002-07-10 20:24
2002.08.05
Слушайте! Правда, что ли, что сборная Россия проиграла Японцам?


8-13727
Pinochet
2002-03-31 14:26
2002.08.05
Direct Sound на Delphi.


1-13690
quark
2002-07-24 00:58
2002.08.05
Как динамически создавать меню


3-13548
Wizzard
2002-07-15 12:49
2002.08.05
Как зарегистрировать DAO в системе? У меня программа...


14-13785
McKenzie
2002-07-10 18:13
2002.08.05
В борьбе с вирусами