Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.02.2017, 17:25
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
Злость Delphi 7 Access Violation

Всем доброго дня
Столкнулась с проблемой при добавлении записей посредством IBTable.
Запускаю проект, и первый раз эти строки выполняются отлично:
Код:
//запись в таблицу ITER
  i := 1;
  itcount := RandomRange(1, 100);
  for i := 1 to itcount-1 do
  BEGIN

        DM.IBTable3.Append;    //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
        DM.IBTable3.FieldByName('IT_ID').AsInteger := 0;   //ВОТ ЗДЕСЬ !!!!!!ACCESS VIOLATION и PRIVILEGED INSTRUCTION ... формируется в базе триггером, есть ID итерации
        DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM;  //для какого расчета..
        DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0;     //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
        DM.IBTable3.FieldByName('X1K').AsFloat := i;   //координата X
        DM.IBTable3.FieldByName('X2K').AsFloat  := RandomRange(1, 50) ;     //координата Y
        DM.IBTable3.FieldByName('FK').AsFloat  := RandomRange(0, 50);
        DM.IBTable3.POST;
  END;
  //DM.IBTable3.Refresh;

НО при повторном срабатывании выдавало ошибку 'Access violation at address XXXXXXX (всегда разный). Read of address YYYYYYYY'

Теперь в этом же месте ошибка 'Privileged instruction' и также при повторной работе кода. Получается, что уже команда Append не проходит..

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

Последний раз редактировалось Rimma Zlotnikov, 18.02.2017 в 17:28.
Ответить с цитированием
  #2  
Старый 18.02.2017, 19:07
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Проблема не решена. Перенесла этот код на более раннюю версию проекта и все стало работать. Что же могло повлиять, интересно
Ответить с цитированием
  #3  
Старый 18.02.2017, 22:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По внешним признакам скорее всего где-то падает обработчик события на визуальных компонентах, привязанных к этой IBTable3. Т.е. проблема не в компоненте доступа к данным, а где-то в визуальной части.
Для решения, например, можно временно "отключать" DataSource, делать вставку, потом обратно "подключать" (там есть методы DisableControls и EnableControls). Кстати, при подключенных визуальных компонентах это еще и работы убыстрит, т.к. не будет обновлять отображение.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Rimma Zlotnikov (19.02.2017)
  #4  
Старый 19.02.2017, 07:58
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
По внешним признакам скорее всего где-то падает обработчик события на визуальных компонентах, привязанных к этой IBTable3. Т.е. проблема не в компоненте доступа к данным, а где-то в визуальной части.
Для решения, например, можно временно "отключать" DataSource, делать вставку, потом обратно "подключать" (там есть методы DisableControls и EnableControls). Кстати, при подключенных визуальных компонентах это еще и работы убыстрит, т.к. не будет обновлять отображение.
Спасибо за ответ. Я сделала так:
Код:
Form1.DBGrid1.DataSource.DataSet.DisableControls;   //попытка исправить Access Violation
//запись в таблицу ITER
  i := 1;
  itcount := RandomRange(1, 100);
  for i := 1 to itcount-1 do
  BEGIN

        DM.IBTable3.Append;    //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
        DM.IBTable3.FieldByName('IT_ID').AsInteger := 0;   //ACCESS VIOLATION ... формируется в базе триггером
        DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM;  //для какого расчета..
        DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0;     //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
        DM.IBTable3.FieldByName('X1K').AsFloat := i;   //координата X
        DM.IBTable3.FieldByName('X2K').AsFloat  := RandomRange(1, 50) ;     //координата Y
        DM.IBTable3.FieldByName('FK').AsFloat  := RandomRange(0, 50);
        DM.IBTable3.POST;
  END;
  DM.IBTable3.Refresh;
  Form1.DBGrid1.DataSource.DataSet.EnableControls;  //попытка исправить Access Violation

НО все осталось прежним
Ответить с цитированием
  #5  
Старый 19.02.2017, 12:18
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Rimma Zlotnikov
...Перенесла этот код на более раннюю версию проекта и все стало работать...
Добавление записей в таблицу у вас происходит штатно, а с Disable/EnableControls вообще прям по всем канонам выполняется код - вывод: в поздней версии проекта есть что-то ещё, здесь не показанное, и к приведённому блоку имеющее прямое отношение, вопрос: что творите ещё в момент выполнения Append
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Rimma Zlotnikov (19.02.2017)
  #6  
Старый 19.02.2017, 17:04
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Добавление записей в таблицу у вас происходит штатно, а с Disable/EnableControls вообще прям по всем канонам выполняется код - вывод: в поздней версии проекта есть что-то ещё, здесь не показанное, и к приведённому блоку имеющее прямое отношение, вопрос: что творите ещё в момент выполнения Append

Больше ничегошеньки не делается c Append.
В целом есть класс, через объект которого вызывается процедура:
Код:
Temp.Method(k1,k2, k3, k4, alpha, betha, X1, X2, dX, E, calcnum, CType);
Эта процедура есть просто "заглушка", которая заполняет БД через IBTable:
Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real;
    calcnum: Integer; CType: integer);
var itcount, i : integer;
BEGIN
  Form1.DBGrid1.DataSource.DataSet.DisableControls;   //попытка исправить Access Violation
//запись в таблицу ITER
  i := 1;
  itcount := RandomRange(1, 100);
  for i := 1 to itcount-1 do
  BEGIN

        DM.IBTable3.Append;    //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
        DM.IBTable3.FieldByName('IT_ID').AsInteger := 0;   //ACCESS VIOLATION ... формируется в базе триггером
        DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM;  //для какого расчета..
        DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0;     //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
        DM.IBTable3.FieldByName('X1K').AsFloat := i;   //координата X
        DM.IBTable3.FieldByName('X2K').AsFloat  := RandomRange(1, 50) ;     //координата Y
        DM.IBTable3.FieldByName('FK').AsFloat  := RandomRange(0, 50);
        DM.IBTable3.POST;
  END;
  DM.IBTable3.Refresh;
  Form1.DBGrid1.DataSource.DataSet.EnableControls;  //попытка исправить Access Violation
END;
Ответить с цитированием
  #7  
Старый 19.02.2017, 17:58
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

В общем, более раннюю версию также запорола. Причем я делала вещи, совершенно не связанные с проблемным IBTable3. Пару раз в этом месте вместо "Access violation" появлялось "External exception"
Ответить с цитированием
  #8  
Старый 19.02.2017, 18:12
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Приношу свои извинения за не совсем полный код. Вот вся процедура:
Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real;
    calcnum: Integer; CType: integer);
var itcount, i : integer;
BEGIN
  Form1.DBGrid1.DataSource.DataSet.DisableControls;   //попытка исправить Access Violation
//запись в таблицу ITER
  i := 1;
  itcount := RandomRange(1, 100);
  for i := 1 to itcount-1 do
  BEGIN

        DM.IBTable3.Append;    //БЫЛА ОШИБКА "cannot focus a disabled or invisible window"
        DM.IBTable3.FieldByName('IT_ID').AsInteger := 0;   //ACCESS VIOLATION ... формируется в базе триггером
        DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM;  //для какого расчета..
        DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0;     //ФОРМИРУЕТСЯ СЕЙЧАС В БАЗЕ триггером. но возможно придется ставить здесь
        DM.IBTable3.FieldByName('X1K').AsFloat := i;   //координата X
        DM.IBTable3.FieldByName('X2K').AsFloat  := RandomRange(1, 50) ;     //координата Y
        DM.IBTable3.FieldByName('FK').AsFloat  := RandomRange(0, 50);
        DM.IBTable3.POST;
  END;
  DM.IBTable3.Refresh;
  Form1.DBGrid1.DataSource.DataSet.EnableControls;  //попытка исправить Access Violation
//дозаполнение полей в таблице CALC - step, criterion, x1optim, x2optim, foptim
  with DM.IBQuery2 do
  BEGIN
      Close;
      SQL.Clear;
      SQL.Add('update calc set step = :step, criterion = :criterion,');
      SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim ');
      SQL.Add('where calcnum = :calcnum');
      Params.ParamByName('calcnum').Value := CALCNUM;
      Params.ParamByName('step').Value := (itcount/2.0) -1;
      Params.ParamByName('criterion').Value := 1.8;
      Params.ParamByName('x1optim').Value := 21;  //брать последнюю итерацию из базы..
      Params.ParamByName('x2optim').Value := 21;      //брать последнюю итерацию из базы..
      Params.ParamByName('foptim').Value := 0.11 ;  //брать последнюю итерацию из базы..
      ExecSQL;
  END;
  DM.IBTable1.Refresh;
END;
Если убрать вторую часть с IBQUERY - то все работает просто ОТЛИЧНО и не ругается..!!
HEPL!!!!! Неужели придется разбивать на две разные процедуры. Но это, чуется мне, бред полный
Ответить с цитированием
  #9  
Старый 19.02.2017, 18:58
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Можно было бы посоветовать для блока with DM.IBQuery2 do подготовить запрос предварительным разбором и оптимизацией типа
Код:
...
 Close;
 if not Prepared then Prepare;
 ...
но делфя и так автоматом подготавливает его при каждом выполнении SQL и поэтому, даже если так и делать, то приложению на это фиолетово, зато можно рекомендовать в конце блока добавить проверку на ашипки
Код:
try
   ExecSQL;
 except
   on e: EDataBaseError do  MessageDlg(e.Message, mtError, [mbOK], 0);
 end;
Ответить с цитированием
  #10  
Старый 19.02.2017, 19:38
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Можно было бы посоветовать для блока with DM.IBQuery2 do подготовить запрос предварительным разбором и оптимизацией типа
Код:
...
 Close;
 if not Prepared then Prepare;
 ...
но делфя и так автоматом подготавливает его при каждом выполнении SQL и поэтому, даже если так и делать, то приложению на это фиолетово, зато можно рекомендовать в конце блока добавить проверку на ашипки
Код:
try
   ExecSQL;
 except
   on e: EDataBaseError do  MessageDlg(e.Message, mtError, [mbOK], 0);
 end;

я сделала по совету:
Код:
with DM.IBQuery2 do
  BEGIN
      Close;
      SQL.Clear;
      SQL.Add('update calc set step = :step, criterion = :criterion,');
      SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim ');
      SQL.Add('where calcnum = :calcnum');
      Params.ParamByName('calcnum').Value := CALCNUM;
      Params.ParamByName('step').Value := (itcount/2.0) -1;
      Params.ParamByName('criterion').Value := 1.8;
      Params.ParamByName('x1optim').Value := 21;  //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
      Params.ParamByName('x2optim').Value := 21;      //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
      Params.ParamByName('foptim').Value := 0.11 ;  //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
      //ExecSQL;
      try
**      ExecSQL; //!!!!!!!!!!!!!!!!!!! illegal character in input file: ' ' ($A0)
*     except
*     **on e: EDataBaseError do* MessageDlg(e.Message, mtError, [mbOK], 0);
*end;
Как может возникать такая ошибка вообще!?!
Ответить с цитированием
  #11  
Старый 19.02.2017, 19:47
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

ввела блок TRY ручками и ошибки не стало. Но сам блок ничего не дал:
Код:
procedure TOptimization.Method(k1: integer; k2: integer; k3: integer; k4: integer; alpha: real; betha: real; X1: real; X2: real; dX: real; E: real;
    calcnum: Integer; CType: integer);
var itcount, i : integer;
BEGIN
  Form1.DBGrid1.DataSource.DataSet.DisableControls;   //ïîïûòêà èñïðàâèòü Access Violation
//çàïèñü â òàáëèöó ITER
  i := 1;
  itcount := RandomRange(1, 100);
  for i := 1 to itcount-1 do
  BEGIN

        DM.IBTable3.Append;    //ÁÛËÀ ÎØÈÁÊÀ "cannot focus a disabled or invisible window"
        DM.IBTable3.FieldByName('IT_ID').AsInteger := 0;   //ACCESS VIOLATION ... ôîðìèðóåòñÿ â áàçå òðèããåðîì
        DM.IBTable3.FieldByName('CALCNUM').AsInteger := CALCNUM;  //äëÿ êàêîãî ðàñ÷åòà..
        DM.IBTable3.FieldByName('ITERNUM').AsInteger := 0;     //ÔÎÐÌÈÐÓÅÒÑß ÑÅÉ×ÀÑ Â ÁÀÇÅ òðèããåðîì. íî âîçìîæíî ïðèäåòñÿ ñòàâèòü çäåñü
        DM.IBTable3.FieldByName('X1K').AsFloat := 1;   //êîîðäèíàòà X
        DM.IBTable3.FieldByName('X2K').AsFloat  := 1; //RandomRange(1, 50) ;     //êîîðäèíàòà Y
        DM.IBTable3.FieldByName('FK').AsFloat  := 1; //RandomRange(0, 50);
        //DM.IBTable3.POST;
        try
          DM.IBTable3.POST;
        except
          on e: EdataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0);
        end;
  END;
  DM.IBTable3.Refresh;
  Form1.DBGrid1.DataSource.DataSet.EnableControls;  //ïîïûòêà èñïðàâèòü Access Violation
  //äîçàïîëíåíèå ïîëåé â òàáëèöå CALC - step, criterion, x1optim, x2optim, foptim
  with DM.IBQuery2 do
  BEGIN
      Close;
      SQL.Clear;
      SQL.Add('update calc set step = :step, criterion = :criterion,');
      SQL.Add(' x1optim = :x1optim, x2optim = :x2optim, foptim = :foptim ');
      SQL.Add('where calcnum = :calcnum');
      Params.ParamByName('calcnum').Value := CALCNUM;
      Params.ParamByName('step').Value := (itcount/2.0) -1;
      Params.ParamByName('criterion').Value := 1.8;
      Params.ParamByName('x1optim').Value := 21;  //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
      Params.ParamByName('x2optim').Value := 21;      //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
      Params.ParamByName('foptim').Value := 0.11 ;  //áðàòü ïîñëåäíþþ èòåðàöèþ èç áàçû..
      //ExecSQL;
      try
        ExecSQL;
      except
        on e: EdataBaseError do MessageDlg(e.Message, mtError, [mbOK], 0);
      end;
  END;
  DM.IBTable1.Refresh;
END;
Ответить с цитированием
  #12  
Старый 19.02.2017, 20:03
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Rimma Zlotnikov
...illegal character in input file: ' ' ($A0)...Как может возникать такая ошибка вообще!?!
Компилятор не понимает символ с кодом $A0. Видимо это след копипасты "возврата каретки", правильно, что "ручками"

Можете показать какие и где вылазят ошибки при выполнении запроса, и я бы на время отключил блок относящийся к выполнению IBTable3.Append, будет проще
Ответить с цитированием
  #13  
Старый 19.02.2017, 20:25
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun

Можете показать какие и где вылазят ошибки при выполнении запроса, и я бы на время отключил блок относящийся к выполнению IBTable3.Append, будет проще
Не совсем поняла просьбу. Ошибка вылазит только там, где я изначально обозначала. До блока TRY даже не доходит
Ответить с цитированием
  #14  
Старый 19.02.2017, 20:26
Rimma Zlotnikov Rimma Zlotnikov вне форума
Прохожий
 
Регистрация: 18.02.2017
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun

Можете показать какие и где вылазят ошибки при выполнении запроса, и я бы на время отключил блок относящийся к выполнению IBTable3.Append, будет проще
Не совсем поняла просьбу. Ошибка вылазит только там, где я изначально обозначала. До блока TRY даже не доходит
Ответить с цитированием
  #15  
Старый 19.02.2017, 20:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Изначально
Цитата:
Сообщение от Rimma Zlotnikov
...'Access violation at address XXXXXXX (всегда разный). Read of address YYYYYYYY'...Теперь в этом же месте ошибка 'Privileged instruction'...
Privileged instruction означает что в программе была попытка вызвать недопустимую в данный момент инструкцию: по-простому, так это порча памяти, что-то пытается кого-то считать или вызвать, а его, родимого, ещё нет или уже нет, ошибка видимо происходит совсем в другом месте
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter