![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Убить DataSet [D4, MSSQL]
flider © (2002-07-12 13:09:00)Приветствую всех!
Есть проблема, может кто поможет.
В ходе работы приложения при выполнении поиска формируется SQL-ный запрос,
результатом работы которого является некий подобранный DataSet. Если после
этого опять выполняется поиск, то предыдущий DataSet закрывается, но не
уничтожается. Из-за этого после 3-7 крупных поисков происходит
переполнение памяти и приложение вешается.
Вопрос: можно ли каким-либо образом ликвидировать старый DataSet при
выполнении нового поиска, но чтобы при этом не вешалось приложени с
системой вместе.
Спасибо.
flider (2002-07-15 19:04:00) [1]Re: fool
Спасибо! А вот такой вопрос: у нас не используется уничтожение формы. Схема такая - SpeedButton на родительской форме, а под ними TabControl (или PageControl, не знаю) - на дочерней. На первой закладке пользователь может задавать параметры поиска. После нажатия на кнопку "Поиск", результат поиска выводится на вторую закладку. При повторном нажатии на Поиск, управлять очисткой памяти будет родительская форма?
fool (2002-07-15 18:29:00) [2]Извините, опечатка (не FrmAgree, а MDIFrm)
fool (2002-07-15 18:27:00) [3]Вероятность есть, но при использовании 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;
flider (2002-07-15 17:57:00) [4]Re: fool
Интересная мысль! Дело в том, что у нас используется не MDI-схема. Может быть дело в этом? Если перейти на MDI все заработает? Какова вероятность этого?
fool (2002-07-15 17:47:00) [5]Послушал я вас всех: даже не знаю че думать(а пока слушал делал 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 15:45:00) [6]А чего? Мне казалось, что если было что-то написано и оно работало, потом было утеряно, а потом попытались восстановить, но оно не работает, то дело именно в коде - не так воспроизвели. Самое обидное, что восстанавливаем-то уже почти два года. Это была практически окончательная версия, и вдруг такая хрень выплыла. Надо что-то делать, а что - непонятно.
Johnmen (2002-07-15 15:37:00) [7]Тем не менее, если ничего, кроме самой программы (кода) не менялось, то это проблема не Дельфей !!!
flider (2002-07-15 15:27:00) [8]Я не меняла версию дельфей. Как были 4 с одного и того же диска, так и ставили.
Johnmen (2002-07-15 15:22:00) [9]Позволь тебе не поверить. :)
Меняя версию Дельфей ты меняла версию прокладки - BDE.
flider (2002-07-15 15:10:00) [10]Нет, ПО все то же самое, что и на старой версии.
Johnmen (2002-07-15 15:06:00) [11]И версия MSSQL не менялась ?
И драйвера(прослойки) доступа не менялись ?
flider (2002-07-15 14:58:00) [12]Re: Johnmen
Я имела в виду оболочка - приложение, сделанное в дельфях, для работы со SQL-ной базой.
Все-таки дело именно в дельфячьем коде, а не в SQL-ном, поскольку, повторюсь, хранимые процедуры не менялись, в отличие от того, что было написано в Дельфях.
Johnmen (2002-07-15 14:45:00) [13]Дельфи - не оболочка, а средство разработки. Поэтому дело не в Дельфях.
flider (2002-07-15 14:31:00) [14]Не, это не тот случай. Здесь просто нет закрытия процедуры,пока она не будет полностью выполнена, а запрос весьма приличный и на каждой машине,в зависимости от параметров, будет срываться на разных повторах, а на крутой машине выполнится полностью.
У нас ситуация иная - запросы-то в программе закрываются Close-ом, и, теоретически, должны полностью уничтожаться по закрытии. Но этого не происходит. Они продолжают где-то висеть в памяти.
И потом, хранимые процедуры SQL одни и те же в современной и в старой версии приложения, различия только в дельфячьей оболочке. И в старой версии все работает, а в новой - рушится.
sniknik (2002-07-15 14:04:00) [15]Johnmen ©
Точно. Всем!!! переходите на Pervasive, вот где я проблем не встречал (глобальных). а с sql вообще просто что написал то и получиш. и ошибки только описанные в доках получаются :-).
а вообще извиняюсь за то что сбил с темы %-(
roottim (2002-07-15 13:58:00) [16]я к тому что SP написана для MSSQL
к нему oledb for sqlserver..
а накой тут jet!
Johnmen (2002-07-15 13:56:00) [17]Как же у вас, поклонников MSSQL, всё запущено...:)))))
sniknik (2002-07-15 13:52:00) [18]ни при чем. просто уходя от одних гемороев обычно попадаеш в другие.
roottim (2002-07-15 13:50:00) [19]а причем тут Jet
sniknik (2002-07-15 13:45:00) [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 и попадеш в другую ж...у, уууу :-)