Форум: "Базы";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
ВнизУбить 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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c