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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #5 : 02-03-2006 12:49 » |
|
Ну, насколько я понял, проблема не в вашей программе, а в настройках BDE. Если вы используете "нативный" драйвер для MS SQL, то запустите BDE Administrator, откройте закладку Configuration, Dribers+Native+MS SQL. Отыщите параметры Blob size, Blobs to cache и попробуйте их изменить.
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #6 : 02-03-2006 17:07 » |
|
Белка, гляди. при каждом клике на ячейку в гриде ты делаешь
BB:=TMemoryStream.Create;
а теперь скажи мне, где ты делаешь BB.Free?
насколько я понимаю, когда данных стало много, у тебя реально стала заканчиваться динамическая память, которую ты выделяешь при каждом клике.
|
|
« Последнее редактирование: 02-03-2006 17:09 от x77 »
|
Записан
|
|
|
|
Oldy
|
|
« Ответ #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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #9 : 03-03-2006 09:16 » |
|
ну это же разные объекты. есть Jp - объект класса TJpegImage. есть BB - объект класса TMemoryStream. ты динамически создаёшь их обоих, ну так и освобождать надо обоих ты попробуй, а потом будем дальше разбираться. тебе в любом случае менять код, потому что твой вариант работы с блоб-полем можно и нужно оптимизировать. но это чуть позже. Oldy, старина, меня тоже смутила эта ошибка - EBDEEngine-бла-бла-бла, там действительно может быть корявка в настройках базы. ибо при выделении памяти ошибку дал бы MemoryManager дельфей. и скорее всего, как раз он-то её и дал. но произошло это, видимо, внутри одного из методов работы с блобами ядра БДЕ. и BDE эту ошибку и отлавливает, и выдаёт за свою, хотя собственно он сам там ни при чём.
|
|
« Последнее редактирование: 03-03-2006 09:26 от x77 »
|
Записан
|
|
|
|
x77
Модератор
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
Модератор
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
|
|
« Ответ #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
Модератор
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
Гость
|
|
« Ответ #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
Гость
|
|
« Ответ #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
|
|
« Ответ #21 : 16-03-2006 12:38 » |
|
По поводу ограничения количества записей возвращаемых запросом, нужно смотреть справку команды "select" используемого вами SQL-сервера. Например: SELECT [FIRST (<integer expr m>)] [SKIP (<integer expr n>)]
|
|
|
Записан
|
С уважением, Oldy.
|
|
|
x77
Модератор
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
Модератор
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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #26 : 24-03-2006 09:56 » |
|
как работает поиск? на Квери, случайно, фильтра не стоят? если да (т.е. юзаются свойства Filter: string и Filtered: boolean), то как они заполняются?
такое ощущение, что ошибка где-то глупая совершенно, типа неосвобождаемого объекта, или ещё какая-то мелочь.
|
|
|
Записан
|
|
|
|
Demidova Aigul
Гость
|
|
« Ответ #27 : 04-04-2006 08:54 » |
|
У нас инет отключали на несколько дней, не могла ответить. Цитата давай попробуем последовательно двигаться. отключи этот обработчик на клик в гриде вообще. проверь, есть ошибка или нет. если нет, отключай обработчик кусками, например оставь сначала один запрос к базе, всё остальное закомментарь. если ошибки нет, комментарь загрузку рисунка и т.д.
попробую потихоньку.
Кажется, это помогает! По крайней мере пока. Я тут мучала базу, отключала и включала все, что можно было. В общем, теперь у меня когда активизирован первый квери, тогда остальные все отключены, когда второй - отключены первый и остальные и т.д. Обнаружила, что я зря сразу активизирую квери, в котором находятся картинки. Теперь он у меня активизируется только тогда, когда это нужно. Сейчас при 4500 записей база работает нормально, эта ошибка не выходит. Но все равно я пока считаю, что рано радоваться. Теперь мне нужно проверить работу базы при 10000 и 40000 записей. Причем, у меня аж целых 12 квери, и почти к каждому есть свой DBGrid с действием DBGridCellClick. И в каждом из этих квери может быть около 40000 записей. Так что потихоньку надо будет добавить в каждый квери по 40000 записей и посмотреть, что будет. Даже страшно. как работает поиск? на Квери, случайно, фильтра не стоят? если да (т.е. юзаются свойства Filter: string и Filtered: boolean), то как они заполняются? Фильтр есть. Точнее сортировка по возрастанию и по убыванию, если конечно это относится к фильтрам. :
|
|
|
Записан
|
|
|
|
|