Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка "Insufficient memory"  (Прочитано 21573 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Demidova Aigul
Гость
« : 28-02-2006 11:23 » 

Всем привет!    Отлично
Люди, прошу вас, помогите чайнику разобраться с ошибкой.
У меня есть база данных на SQL Server (е). Сама программа написана на Delphi 6. В одной из интересующих меня таблиц в базе 3613 записей. Вот когда я запускаю программу при таком количестве записей (т.е. 3613), то она работает. А если в базе будет в этой таблице не 3613 записей, а больше, скажем к примеру, 4500, то уже при запуске программы выходит ошибка "EDBEngineError with message 'Insufficient memory for this operation'."
А мне надо, чтоб в будущем программа работала вообще при 40000 записей, а она уже сейчас при 4500 не работает. Что делать?
Подскажите, пожалуйста!  Скромно так...
« Последнее редактирование: 04-12-2007 20:56 от Алексей1153++ » Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 28-02-2006 11:30 » 

ОЙ! Небось всё, всё, всё сразу пооткрывала?
Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #2 : 01-03-2006 07:11 » 

Цитата
ОЙ! Небось всё, всё, всё сразу пооткрывала?

всё, всё, всё сразу - это вы про что именно?  Здесь была моя ладья...
Вообще у меня при запуске появляется форма в виде вкладки с 4 страницами. На первой странице есть один DBGrid (я его активизирую при TabSheet1Show, т.е. Query, который связан с этим DBGrid-ом), на 2-ой странице у меня 5 DBGrid(ов), которые активизируются при TabSheet2Show, и на 3-ей и 4-ой странице вкладки по одному DBGrid(у). Вот, посоветуйте мне, что делать?  Не понял 
« Последнее редактирование: 01-03-2006 10:43 от Belka* » Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-03-2006 11:34 » 

А Query Активизируются при открытии соответствующих TabSheet'отв (с закрытием предыдущих) или по умолчению TQuery.Active = True? Объясните подробнее.
« Последнее редактирование: 04-12-2007 21:02 от Алексей1153++ » Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #4 : 02-03-2006 10:17 » 

Цитата
А Query Активизируются при открытии соответствующих TabSheet'отв (с закрытием предыдущих) или по умолчению TQuery.Active = True? Объясните подробнее.

Query у меня,активизируются при открытии соответствующих TabSheet'отв, правда, прочитав ваш вопрос, я заметила, что при переходе к следующему TabSheet'у в предыдущем TabSheet'е так и остается TQuery.Active = True.
А в датамодуле у меня все Query выставлены в False.

Вот, решила рассказать поточнее насчет ошибки.

Вообще у меня при запуске появляется форма в виде вкладки с 4 страницами. На первой странице есть один DBGrid (я его активизирую при TabSheet1Show, т.е. Query, который связан с этим DBGrid-ом), на 2-ой странице у меня 5 DBGrid(ов), которые активизируются при TabSheet2Show, и на 3-ей и 4-ой странице вкладки по одному DBGrid(у). Раньше у меня программа тормозила, т.к. я все запросы сразу ставила в Active:=True (прямо в датамодуле), а таких запросов у меня много, естественно это тормозило. Но теперь они у меня в датамодуле False, а активизируются при TabSheetShow. Раньше все работало при таком раскладе нормально, но когда количество данных увеличилось до 4500 и выше, то появлялась эта ошибка.

А если быть еще точнее, ошибка, указанная в названии темы, выходит в момент нажатия на один из DBGrid-ов. Вот такой у меня запрос на это действие:

Код:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var JP:TJpegImage;
    BB:TMemoryStream;
    R:TRect;
begin

image_mapp.Visible:=True;

with dm.modif2 do begin
Close;
SQL.Clear;

SQL.Add(' SELECT id, InventoryID, Autors, ReportName, ReportYear, OrgName, OrgAdress, Abstract, KeyWords, ColBooks, ColFolders, ColPervInf, dostup_k_referat');
SQL.Add(' FROM Referats');
SQL.Add(' WHERE id = '+IntToStr(dm.Query1id.AsInteger)+'');
Prepare;
Open;

inv_n.Text:=Fields[1].AsString;
avtor.Text:=Fields[2].AsString;
name_rep_memo.Text:=Fields[3].AsString;
y.Text:=Fields[4].AsString;
org_name.Text:=Fields[5].AsString;
adres.Text:=Fields[6].AsString;
abstr_memo.Text:=Fields[7].AsString;
key_word.Text:=Fields[8].AsString;
col_book.Text:=Fields[9].AsString;
col_folder.Text:=Fields[10].AsString;
col_perv.Text:=Fields[11].AsString;
dostup_referat.Text:=Fields[12].AsString;

inv_n_b.Text:=inv_n.Text;
inv_n_f.Text:=inv_n.Text;
inv_numb_graf.Text:=inv_n.Text;
inv_perv_folder.Text:=inv_n.Text;
inv_perv_data.Text:=inv_n.Text;

d:=StrToInt(dm.Query1.Fields[9].Value);
df:=StrToInt(dm.Query1.Fields[10].Value);
dp:=StrToInt(dm.Query1.Fields[11].Value);
end;

BB:=TMemoryStream.Create;
with dm.Query_path do begin
Close;
SQL.Clear;
SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+'''');
Open;

if IsEmpty then begin
image_mapp.Visible:=false;
ShowMessage ('Привязанных рисунков нет!');
exit
end
else
begin
BB.Seek(0,soFromBeginning);
TBlobField(dm.Query_path.FieldByName('path')).SaveToStream(BB);
BB.Seek(0,soFromBeginning);
jp:=TJPEGImage.Create;
jp.LoadFromStream(BB);
JP.DIBNeeded;
R:=StretchImage1(JP);

with image_mapp do begin
  Stretch:=false;
  Picture.Bitmap.Assign(JP);
  Width:=Abs(R.Right-R.Left);
  Height:=Abs(R.Top-R.Bottom);
  Stretch:=true;
end;
jp.Free;
end;
end;
end;



Ой, только не судите строго мой код, я ж чайник еще!  Скромно так...

В общем, с помощью этого кода когда я нажимаю на одну из строк DBGrid(а) в форме, в окошках TMemo появляются подробные записи, относящиеся к выбранной в DBGrid(е) строке, а в TImage появляется рисунок (карта), тоже относящаяся к этой строке.

Так как теперь в базе кол-во рисунков тоже около 4500, то может они тоже тормозят работу приложения?  Здесь была моя ладья...
Ну как мне с этим всем бороться? Помогите! 
 

« Последнее редактирование: 04-12-2007 21:03 от Алексей1153++ » Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 02-03-2006 12:49 » 

Ну, насколько я понял, проблема не в вашей программе, а в настройках BDE. Если вы используете "нативный" драйвер для MS SQL, то запустите BDE Administrator, откройте закладку Configuration, Dribers+Native+MS SQL. Отыщите параметры Blob size, Blobs to cache и попробуйте их изменить.
Записан

С уважением, Oldy.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 02-03-2006 17:07 » 

Белка, гляди. при каждом клике на ячейку в гриде ты делаешь

BB:=TMemoryStream.Create;

а теперь скажи мне, где ты делаешь BB.Free?

насколько я понимаю, когда данных стало много, у тебя реально стала заканчиваться динамическая память, которую ты выделяешь при каждом клике.
« Последнее редактирование: 02-03-2006 17:09 от x77 » Записан

Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 03-03-2006 05:26 » 

А ведь верно, не заметил.
« Последнее редактирование: 03-03-2006 10:20 от Oldy » Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #8 : 03-03-2006 05:53 » 

Цитата
Белка, гляди. при каждом клике на ячейку в гриде ты делаешь

BB:=TMemoryStream.Create;

а теперь скажи мне, где ты делаешь BB.Free?

Так я же поставила jp.Free; в конце кода, перед тремя последними end. Это разве не считается?  Здесь была моя ладья...
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #9 : 03-03-2006 09:16 » 

ну это же разные объекты. есть Jp - объект класса TJpegImage. есть BB - объект класса TMemoryStream. ты динамически создаёшь их обоих, ну так и освобождать надо обоих Ага

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

Oldy, старина, меня тоже смутила эта ошибка - EBDEEngine-бла-бла-бла, там действительно может быть корявка в настройках базы. ибо при выделении памяти ошибку дал бы MemoryManager дельфей. и скорее всего, как раз он-то её и дал. но произошло это, видимо, внутри одного из методов работы с блобами ядра БДЕ. и BDE эту ошибку и отлавливает, и выдаёт за свою, хотя собственно он сам там ни при чём.
« Последнее редактирование: 03-03-2006 09:26 от x77 » Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 03-03-2006 09:21 » 

да, и ещё один вопрос. экземпляром какого класса является modif2? TQuery? TAdoQuery?
Записан

Demidova Aigul
Гость
« Ответ #11 : 03-03-2006 10:05 » 

Цитата
да, и ещё один вопрос. экземпляром какого класса является modif2? TQuery? TAdoQuery?

x77, modif2 у меня TQuery.
Я поставила BB.Free, и по совету Oldy исправила настройки в BDE. Но, к сожалению, все это не помогло.  Здесь была моя ладья...
Видно, не только в этом дело.  Жаль


Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #12 : 03-03-2006 10:45 » 

Белка, разберёмся, не переживай Улыбаюсь

сделай так:

Код:
var
  bs: TBlobStream;
begin
  // создаём поток из поля базы (данные из поля будут уже в потоке)
  bs := TBlobStream.Create ((dm.Query_path.FieldByName('path') as TBlobField), bmRead);
  try
    // кОртинка
    jp:=TJPEGImage.Create;
    try
      // грузим из потока
      jp.LoadFromStream(bs);
      JP.DIBNeeded;
      ...
    finally
      // прибираемся
      jp.Free;
    end;
  finally
    // прибираемся
    bs.Free;
  end;

я исхожу из того, что PATH - это блоб поле в котором хранится кОртинка, а не путь к ней, как кажется из названия.

поменяй этот участкок кода, покажи что получилось, и будем дальше двигаться.
« Последнее редактирование: 04-12-2007 21:04 от Алексей1153++ » Записан

Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 03-03-2006 11:26 » 

Белка, а трассировать не пробовала, на какой строке становится? (какая строка вызывает ошибку?)
Записан

С уважением, Oldy.
Demidova Aigul
Гость
« Ответ #14 : 10-03-2006 09:02 » 

to x77 и Oldy:
попробовала изменить код и трассировать, все равно "Insufficient memory".  Жаль
Код:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var JP:TJpegImage;
    BB: TBlobStream;
    R:TRect;
begin
image_mapp.Visible:=True;

with dm.modif2 do begin
Close;
SQL.Clear;

SQL.Add(' SELECT id, InventoryID, Autors, ReportName, ReportYear, OrgName, OrgAdress, Abstract, KeyWords, ColBooks, ColFolders, ColPervInf, dostup_k_referat');
SQL.Add(' FROM Referats');
SQL.Add(' WHERE id = '+IntToStr(dm.Query1id.AsInteger)+'');
Prepare;
Open;

inv_n.Text:=Fields[1].AsString;
avtor.Text:=Fields[2].AsString;
name_rep_memo.Text:=Fields[3].AsString;
y.Text:=Fields[4].AsString;
org_name.Text:=Fields[5].AsString;
adres.Text:=Fields[6].AsString;
abstr_memo.Text:=Fields[7].AsString;
key_word.Text:=Fields[8].AsString;
col_book.Text:=Fields[9].AsString;
col_folder.Text:=Fields[10].AsString;
col_perv.Text:=Fields[11].AsString;
dostup_referat.Text:=Fields[12].AsString;

inv_n_b.Text:=inv_n.Text;
inv_n_f.Text:=inv_n.Text;
inv_numb_graf.Text:=inv_n.Text;
inv_perv_folder.Text:=inv_n.Text;
inv_perv_data.Text:=inv_n.Text;

d:=StrToInt(dm.Query1.Fields[9].Value);
df:=StrToInt(dm.Query1.Fields[10].Value);
dp:=StrToInt(dm.Query1.Fields[11].Value);
end;

with dm.Query_path do begin
Close;
SQL.Clear;
SQL.Add('SELECT id, path, InventoryID FROM map_path where InventoryID ='''+dm.Query1InventoryID.AsString+'''');
Open;

if IsEmpty then begin
image_mapp.Visible:=false;
ShowMessage (Привязанных рисунков нет!');
exit
end
else
begin
BB.Seek(0,soFromBeginning);
BB := TBlobStream.Create ((dm.Query_path.FieldByName('path') as TBlobField), bmRead);
try
BB.Seek(0,soFromBeginning);
jp:=TJPEGImage.Create;
try
jp.LoadFromStream(BB);
JP.DIBNeeded;
R:=StretchImage1(JP);
with image_mapp do begin
  Stretch:=false;
  Picture.Bitmap.Assign(JP);
  Width:=Abs(R.Right-R.Left);
  Height:=Abs(R.Top-R.Bottom);
  Stretch:=true;
end;
finally
jp.Free;
end;
finally
BB.Free
end;
end;
end;
end;


А при трассировании останавливается и выдает ошибку "Insufficient memory" на строке Open; - самый первый Open с начала кода.   Быть такого не может
« Последнее редактирование: 04-12-2007 21:05 от Алексей1153++ » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #15 : 12-03-2006 01:29 » 

какие-нибудь обработчики висят на AfterOpen или BeforeOpen?

что ещё происходит при открытии таблицы кроме того, что ты написала здесь?

ошибка вылетает при первом же открытии, или какое-то время программа работает нормально, а потом вылетает ошибка?
Записан

Demidova Aigul
Гость
« Ответ #16 : 14-03-2006 10:30 » 

to x77:

Цитата
какие-нибудь обработчики висят на AfterOpen или BeforeOpen?

вроде нет.

Цитата
что ещё происходит при открытии таблицы кроме того, что ты написала здесь?

Ничего. Только на открытие формы у меня заполняются 4 комбобокса, но там не так много данных.

Цитата
ошибка вылетает при первом же открытии, или какое-то время программа работает нормально, а потом вылетает ошибка?

в общем, при запуске программы у меня появляется заставка и формочка маленькая, запрашивающая пароль. Затем появляется главная форма в виде вкладки PageControl с четырьмя страницами (TabSheet1,2,3,4). На TabSheet1 у меня этот злополучный DBGrid (с 4500 строками). Пока я не нажимаю на одну из строк DBGrid(а) или одну из кнопок навигации (например, на последнюю запись), ошибки нет. У меня есть кнопочка "Добавить" (чтобы добавлять данные из TEdit(ов) в DBGrid), но она работает, правда медленно добавляет. Еще вполне нормально работает поиск записей, правда тоже медленно. 
Я тут подумала, что может это и не очень хорошо, что в DBGrid(е) отображаются все записи из таблицы, на которую он настроен (вдруг там вообще когда-нибудь будет не 40000 записей, а 100000 и более)? Может нужно, чтобы в DBGrid появлялась только последняя внесенная запись, а не все? Или может нужно сделать так, чтобы в DBGrid(е) всегда отображалось только 10 записей (например), а если нажать потом на кнопку навигации (например, на кнопку "на следующую запись"), тогда эти 10 записей исчезнут из DBGrid(а), а на их месте появятся следующие 10 записей.  Здесь была моя ладья...   Здесь была моя ладья...  Здесь была моя ладья...  Здесь была моя ладья...  Здесь была моя ладья...

Help, please - руки вообще опускаются, что делать?  С ума сойти...  Жаль


Вот, это первая страничка TabSheet1. Рядом с DBGrid - у меня компонент TImage. Если из DBGrid выбрать одну из строк и нажать, то по-хорошему в TImage должна появиться картинка, а в TEdit(ах) определенные записи, а у меня здесь ошибка появляется.  Жаль
« Последнее редактирование: 15-03-2006 06:19 от Belka* » Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #17 : 14-03-2006 20:46 » 

Belka, посмотри свой SQL-запрос:
Код:
SQL.Add(' SELECT id, InventoryID, Autors, ReportName, ReportYear, OrgName, OrgAdress, Abstract, KeyWords, ColBooks, ColFolders, ColPervInf, dostup_k_referat');
SQL.Add(' FROM Referats');
SQL.Add(' WHERE id = '+IntToStr(dm.Query1id.AsInteger)+'');
Зачем здесь в конце +"
« Последнее редактирование: 04-12-2007 21:07 от Алексей1153++ » Записан
Demidova Aigul
Гость
« Ответ #18 : 15-03-2006 06:18 » 

Цитата
Belka, посмотри свой SQL-запрос:

Код:
SQL.Add(' SELECT id, InventoryID, Autors, ReportName, ReportYear, OrgName, OrgAdress, Abstract, KeyWords, ColBooks, ColFolders, ColPervInf, dostup_k_referat');
SQL.Add(' FROM Referats');
SQL.Add(' WHERE id = '+IntToStr(dm.Query1id.AsInteger)+'');Зачем здесь в конце +"

У меня без плюса не работает, ошибку выдает.

Меня вот это очень интересует, может кто-то подскажет?  Здесь была моя ладья...
Цитата
Я тут подумала, что может это и не очень хорошо, что в DBGrid(е) отображаются все записи из таблицы, на которую он настроен (вдруг там вообще когда-нибудь будет не 40000 записей, а 100000 и более)? Может нужно, чтобы в DBGrid появлялась только последняя внесенная запись, а не все? Или может нужно сделать так, чтобы в DBGrid(е) всегда отображалось только 10 записей (например), а если нажать потом на кнопку навигации (например, на кнопку "на следующую запись"), тогда эти 10 записей исчезнут из DBGrid(а), а на их месте появятся следующие 10 записей.           
« Последнее редактирование: 04-12-2007 21:07 от Алексей1153++ » Записан
zubr
Модератор

by
Offline Offline
Пол: Мужской

« Ответ #19 : 15-03-2006 07:41 » 

Цитата
У меня без плюса не работает, ошибку выдает.
Не понял... Ошибку какую, при компиляции что ли? Перепроверь все хорошо еще раз. В твоем SQL-запросе в конце кавычки ну совсем не нужны, возможно из за этого и все проблемы.
Попробуй так:
Код:
SQL.Add(' WHERE id = '+dm.Query1id.AsString);

Цитата
Я тут подумала, что может это и не очень хорошо, что в DBGrid(е) отображаются все записи из таблицы, на которую он настроен (вдруг там вообще когда-нибудь будет не 40000 записей, а 100000 и более)? Может нужно, чтобы в DBGrid появлялась только последняя внесенная запись, а не все? Или может нужно сделать так, чтобы в DBGrid(е) всегда отображалось только 10 записей (например), а если нажать потом на кнопку навигации (например, на кнопку "на следующую запись"), тогда эти 10 записей исчезнут из DBGrid(а), а на их месте появятся следующие 10 записей.
В хэлпе на TDBGrid ничего нет насчет ограничения на количество записей.
« Последнее редактирование: 04-12-2007 21:08 от Алексей1153++ » Записан
Demidova Aigul
Гость
« Ответ #20 : 16-03-2006 10:40 » 

Цитата
Цитата
У меня без плюса не работает, ошибку выдает.
Не понял... Ошибку какую, при компиляции что ли? Перепроверь все хорошо еще раз. В твоем SQL-запросе в конце кавычки ну совсем не нужны, возможно из за этого и все проблемы.
Попробуй так:

Код:
SQL.Add(' WHERE id = '+dm.Query1id.AsString);

Убрала плюсик и кавычки, но и это не помогло.  Жаль
Ну что же мне делать?  Должен же быть выход!!! Должен же быть выход!!! Должен же быть выход!!!
« Последнее редактирование: 04-12-2007 21:09 от Алексей1153++ » Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 16-03-2006 12:38 » 

По поводу ограничения количества записей  возвращаемых запросом, нужно смотреть справку команды "select" используемого вами SQL-сервера.
Например: SELECT [FIRST (<integer expr m>)] [SKIP (<integer expr n>)]
Записан

С уважением, Oldy.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #22 : 16-03-2006 17:54 » 

Belka*, да можно и так сделать - по 10 записей фетчить. но это не выход.

Код:
...
else begin

  BB.Seek(0,soFromBeginning); // - Зачем это? поток ещё не создан, будет ошибка. убрать в бобруйск!

  BB := TBlobStream.Create ((dm.Query_path.FieldByName('path') as TBlobField), bmRead);
  try

    BB.Seek(0,soFromBeginning); // - не вижу смысла для сего действа. ну, перешли на начало.
                                               // так мы и так на начале, ибо это положение по дефолту при создании

    jp:=TJPEGImage.Create;
    try
      jp.LoadFromStream(BB); // зачОт
      JP.DIBNeeded;

      R:=StretchImage1(JP); // что это? что оно делает? код в студию!

      with image_mapp do begin
        Stretch:=false;
        Picture.Bitmap.Assign(JP);
        Width:=Abs(R.Right-R.Left);
        Height:=Abs(R.Top-R.Bottom);
        Stretch:=true;
      end;
    finally
      jp.Free;
    end;
  finally
    BB.Free
  end;
end;
...

переделывай, рассказывай Улыбаюсь и не расстраивайся, всё будет хорошо.
« Последнее редактирование: 04-12-2007 21:10 от Алексей1153++ » Записан

Demidova Aigul
Гость
« Ответ #23 : 17-03-2006 08:21 » 

Я убрала BB.Seek(0,soFromBeginning) - не помогло. Но все равно мне так больше нравится, без этого BB.Seek  Улыбаюсь

Насчет StretchImage1 - это чтобы вводимую картинку подправить:
Код:
function TForm1.StretchImage1(jp: TJPEGImage): TRect;
var dw,dh:Single;
begin
Result.Top:=0; Result.Left:=0;
dw:=300/jp.Width;
dh:=300/jp.Height;
if jp.Height*dw>300 then
  begin
   Result.Bottom:=300;
   Result.Right:=Floor(dh*jp.Width);
     end
  else
  begin
   Result.Bottom:=Floor(dw*jp.Height);
   Result.Right:=300;
  end;
end;

Еще хочу отметить, что у меня на этот DBGrid настроен PopupMenu (для ввода и удаления картинки и для сохранения картинки в файл), может это тоже тормозит работу?  Не понял

Цитата
Belka*, да можно и так сделать - по 10 записей фетчить. но это не выход.

А почему не выход? Почему так хуже? А сколько максимально введенных строк может показать DBGrid, чтоб при этом не тормозить? То есть мне интересно, неужели если у меня будет потом 40000 записей и более, все равно DBGrid должен все их показать и не тормозить при этом на любые действия?  Здесь была моя ладья...




 
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #24 : 22-03-2006 13:04 » 

Работу тормозит то, как организованно всё это священнодейство, это никак с ошибкой не связано. не вот этот конкретный код, а сам принцип.

Ищи, что ещё происходит при клике. На AfterScroll есть обработчики? покажи вообще всё, что висит в модуле данных в Events на Query, которую ты открываешь.

смысл квери в том, что она фетчит данные по мере того, как ты к ним обращаешься. при открытии запроса данные вообще не фетчаться, там тормозить физически нечему. но поскольку у тебя к квери привязан грид, БДЕ соображает, что в нём нехило бы чёта показать благодарным телезрителям. грид "знает", сколько записей на него влезет при его текущем размере, и говорит датасорсу: "дядя хочет". датасорс активирует т.н. "даталинк", приблуду, которой он связан с твоей квери, и только тогда квери начинает сосать данные из базы, засовывать их во внутренние буферы БДЕ, и дёргать даталинк в обратную сторону. в конечном итоге гриду скажут "эй, дядя, иди - забирай" и он пойдёт и заберёт. Так работают все компоненты, унаследованные от корявых TCustomBDEDataSet, и они сами по себе тормозят на больших объёмах данных ВСЕГДА. они по-другому не обучены.

Я не встречал ни одного человека, который в состоянии осмыслить более 10-15 строчек инфы. Ну, 100 строчек. но не 4 500 в любом случае. закономерный вопрос - а нафига ему их показывать? это интерфейсная проблема, а не проблема объёмов, которые тянет база. должна быть внятная настройка по фильтрам, чтобы юзер сразу сказать, что ему надо, из какой оперы, и прога ему эти несколько десятков строчек (хорошо, пусть 100) запросит из базы и выдаст на экран. Запрашивать всю таблицу - это ненужная роскошь. Даже самому юзеру ненужная.

нигде в топе не нашёл, какая СУБД? Парадокс? 8-O

давай попробуем последовательно двигаться. отключи этот обработчик на клик в гриде вообще. проверь, есть ошибка или нет. если нет, отключай обработчик кусками, например оставь сначала один запрос к базе, всё остальное закомментарь. если ошибки нет, комментарь загрузку рисунка и т.д.

извини, что пропадаю, работа Жаль
Записан

Demidova Aigul
Гость
« Ответ #25 : 24-03-2006 08:52 » 

Цитата
Ищи, что ещё происходит при клике. На AfterScroll есть обработчики? покажи вообще всё, что висит в модуле данных в Events на Query, которую ты открываешь.

Не, на AfterScroll  нет у меня ничего, и вообще именно в модуле данных в Events на Query у меня нет ничего.  Не-а... А вот в Events на DBGrid у меня есть кроме уже показанного кода на  DBGrid1CellClick еще и DBGrid1TitleClick (там у меня сортировка по возрастанию и убыванию), и еще есть PopupMenu, про который я уже тоже писала. Но вряд ли сортировка по возрастанию и убыванию и PopupMenu могут быть причиной торможения?

Цитата
смысл квери в том, что она фетчит данные по мере того, как ты к ним обращаешься. при открытии запроса данные вообще не фетчаться, там тормозить физически нечему. но поскольку у тебя к квери привязан грид, БДЕ соображает, что в нём нехило бы чёта показать благодарным телезрителям. грид "знает", сколько записей на него влезет при его текущем размере, и говорит датасорсу: "дядя хочет". датасорс активирует т.н. "даталинк", приблуду, которой он связан с твоей квери, и только тогда квери начинает сосать данные из базы, засовывать их во внутренние буферы БДЕ, и дёргать даталинк в обратную сторону. в конечном итоге гриду скажут "эй, дядя, иди - забирай" и он пойдёт и заберёт. Так работают все компоненты, унаследованные от корявых TCustomBDEDataSet, и они сами по себе тормозят на больших объёмах данных ВСЕГДА. они по-другому не обучены.

Прикольно объяснил.  Отлично

Цитата
нигде в топе не нашёл, какая СУБД? Парадокс? 8-O
У меня SQL Server 2000.

Цитата
Я не встречал ни одного человека, который в состоянии осмыслить более 10-15 строчек инфы. Ну, 100 строчек. но не 4 500 в любом случае. закономерный вопрос - а нафига ему их показывать? это интерфейсная проблема, а не проблема объёмов, которые тянет база. должна быть внятная настройка по фильтрам, чтобы юзер сразу сказать, что ему надо, из какой оперы, и прога ему эти несколько десятков строчек (хорошо, пусть 100) запросит из базы и выдаст на экран. Запрашивать всю таблицу - это ненужная роскошь. Даже самому юзеру ненужная.

Ну у меня здесь фильтр только по одному полю есть (по инвентарному номеру), т.к. расширенный поиск есть отдельно в двух вариантах в виде отдельного приложения и в виде интернет-странички. А здесь так надо - только по инвентарному номеру. И здесь поиск нужен только для того, чтобы заполняющий базу видел только что внесенную запись, чтоб проверить, все ли в порядке, и если что - подправить. Вот насчет поиска - поиск работает при 4500 записей, но медленно (!), зато когда в результате поиска появляется в DBGrid только одна запись, то при нажатии на нее естественно все нормально срабатывает, без ошибки. Что еще интересно: если после этого поиска нажать на кнопку "все записи" (после этого в гриде появляются все записи из квери), то потом, при нажатии на выбранную запись в этом гриде, все работает нормально и не появляется эта ошибка "Insufficient memory".  А черт его знает...  Может это поможет как-то решить проблему с ошибкой?   Здесь была моя ладья...

Цитата
давай попробуем последовательно двигаться. отключи этот обработчик на клик в гриде вообще. проверь, есть ошибка или нет. если нет, отключай обработчик кусками, например оставь сначала один запрос к базе, всё остальное закомментарь. если ошибки нет, комментарь загрузку рисунка и т.д.

попробую потихоньку.

Цитата
извини, что пропадаю, работа 

да ничего страшного, понимаю. Спасибо, что помогаешь.  Улыбаюсь Мне очень надо эту проблему решить, а то по шапке надают.  В капусту порублю!
Хорошо, что пока еще есть на это время.  Улыбаюсь





« Последнее редактирование: 24-03-2006 08:57 от Belka* » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #26 : 24-03-2006 09:56 » 

как работает поиск? на Квери, случайно, фильтра не стоят? если да (т.е. юзаются свойства Filter: string и Filtered: boolean), то как они заполняются?

такое ощущение, что ошибка где-то глупая совершенно, типа неосвобождаемого объекта, или ещё какая-то мелочь.
Записан

Demidova Aigul
Гость
« Ответ #27 : 04-04-2006 08:54 » new

У нас инет отключали на несколько дней, не могла ответить.

Цитата
Цитата
давай попробуем последовательно двигаться. отключи этот обработчик на клик в гриде вообще. проверь, есть ошибка или нет. если нет, отключай обработчик кусками, например оставь сначала один запрос к базе, всё остальное закомментарь. если ошибки нет, комментарь загрузку рисунка и т.д.

попробую потихоньку.

Кажется, это помогает!  Отлично По крайней мере пока. Я тут мучала базу, отключала и включала все, что можно было. В общем, теперь у меня когда активизирован первый квери, тогда остальные все отключены, когда второй - отключены первый и остальные и т.д. Обнаружила, что я зря сразу активизирую квери, в котором находятся картинки. Теперь он у меня активизируется только тогда, когда это нужно. Сейчас при 4500 записей база работает нормально, эта ошибка не выходит. Но все равно я пока считаю, что рано радоваться. Теперь мне нужно проверить работу базы при 10000 и 40000 записей. Причем, у меня аж целых 12 квери, и почти к каждому есть свой DBGrid с действием  DBGridCellClick. И в каждом из этих квери может быть около 40000 записей.  Я шокирован!   Так что потихоньку надо будет добавить в каждый квери по 40000 записей и посмотреть, что будет. Даже страшно.  Я шокирован!

Цитата
как работает поиск? на Квери, случайно, фильтра не стоят? если да (т.е. юзаются свойства Filter: string и Filtered: boolean), то как они заполняются?

Фильтр есть. Точнее сортировка по возрастанию и по убыванию, если конечно это относится к фильтрам.  :Улыбаюсь


Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines