![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день! Возникла проблема с вылетами программы при закрытии запросов к базе данных. Хотел бы сразу сказать, что этот код отлично работал в течение довольно-таки долгого времени, однако теперь подобные конструкции перестали работать практически по всей программе и найти ошибку пока никак не удается. В приведенном фрагменте кода используются три таблицы. Одна главная и две связанные с ней.
Сначала при помощи хранимой процедуры SP_wagon_in_ins (компонент TStoredProc) создается запись в главной таблице. Потом открывается и закрывается запрос P_wagon_in_view (это компонент TQuery) на просмотр только что созданной записи (в которой триггером в базе данных автоматически заполняются некоторые поля). После этого открываются и закрываются запросы P_wagon_in_view и P_wagon_ann_view (также компоненты TQuery) для просмотра записей в подчиненных таблицах, связанных с созданной в главной таблице записью. Если запускать программу из под билдера Delphi 2007 то возникает ошибка Project ….. faulted with message: ‘access violation at 0x7c90e8ab: write of address 0x00030ffc’ Process stopped. Use step or run to continue. При пошаговом выполнении кода получается, что вылет происходит после закрытия последнего запроса (после TQuery.Close), причем независимо от того, какой из двух запросов (P_wagon_in_view или P_wagon_ann_view) закрывается вторым, вылетает именно после последнего закрытого. Прошу вас предложить какие-либо варианты решения этой проблемы или возможно указать на ошибку в тексте программы. Код:
procedure TWagon_in_new.Button_saveClick(Sender: TObject); begin SP_wagon_in_ins.UnPrepare; SP_wagon_in_ins.ParamByName('@dispatch_date').Value:=E_dispatch_date.Text; SP_wagon_in_ins.ParamByName('@wagon_in_num').Value:=E_wagon_in_num.Text; SP_wagon_in_ins.ParamByName('@bill_wagon_in_num').Value:=E_bill_wagon_in_num.Text; SP_wagon_in_ins.ParamByName('@partner_id').Value:=ID_partner; SP_wagon_in_ins.ParamByName('@contract_number').Value:=E_contract_number.Text; SP_wagon_in_ins.ParamByName('@origin').Value:=ID_origin; SP_wagon_in_ins.Prepare; SP_wagon_in_ins.ExecProc; ID_wagon:=SP_wagon_in_ins.ParamByName('@out').Value; P_wagon_in_view.ParamByName('ID').Value:=ID_wagon; P_wagon_in_view.Open; if P_Wagon_in_view.FieldByName('placesnum_announced').Value<>NULL then E_placesnum_announced.Text:=P_Wagon_in_view.FieldByName('placesnum_announced').Value; if P_Wagon_in_view.FieldByName('placesnum_in').Value<>NULL then E_placesnum_in.Text:=P_Wagon_in_view.FieldByName('placesnum_in').Value; if P_Wagon_in_view.FieldByName('netweight_announced').Value<>NULL then E_netweight_announced.Text:=P_Wagon_in_view.FieldByName('netweight_announced').Value; if P_Wagon_in_view.FieldByName('gweight_announced').Value<>NULL then E_gweight_announced.Text:=P_Wagon_in_view.FieldByName('gweight_announced').Value; if P_Wagon_in_view.FieldByName('netweight_in').Value<>NULL then E_netweight_in.Text:=P_Wagon_in_view.FieldByName('netweight_in').Value; if P_Wagon_in_view.FieldByName('gweight_in').Value<>NULL then E_gweight_in.Text:=P_Wagon_in_view.FieldByName('gweight_in').Value; P_wagon_in_view.Close; P_quality_in_view.ParamByName('ID').Value:=ID_wagon; P_quality_ann_view.ParamByName('ID').Value:=ID_wagon; P_quality_in_view.Open; P_quality_ann_view.Open; P_quality_in_view.Close; P_quality_ann_view.Close; // после этой строки появляется ошибка Button_new_ann.Enabled:=true; Button_edit_ann.Enabled:=true; Button_new_in.Enabled:=true; Button_edit_in.Enabled:=true; Button_OK.Enabled:=true; Button_save.Enabled:=false; end; Вот такая проблема. Последний раз редактировалось Admin, 22.11.2008 в 13:24. |