Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приведенный код выдает -805-ю ошибку [D6, Firebird]


miwa ©   (2004-04-15 18:32:00) 


var ppl: TStringList;
...
   for i:=0 to ppl.Count-1 do
     try
       dtmData.ibqFilmsSet.ParamByName('P1').AsString:=ppl[i];
       dtmData.ibqFilmsSet.ExecSQL;
     finally
       dtmData.ibqFilmsGet.ParamByName('P2').AsString:=ppl[i];
       dtmData.ibqFilmsGet.Open;
       ppl.Objects[i]:=pointer(dtmData.ibqFilmsGet.Fields[0].AsInteger);
     end;//try-for

Ну и, соответственно, когда в таблице есть додаваемая запись (она должна быть уникальной), то в соответствующий ppl.Objects должен записываться ее ID. Ан нет! Блок finally не срабатывает, я просто получаю ошибку доступа к первичному ключу или уникальному полю. Почему?


kaif   (2004-04-15 21:16:00) [1]

var ppl: TStringList;
...
  for i:=0 to ppl.Count-1 do
    try
     try
        dtmData.ibqFilmsSet.ParamByName('P1').AsString:=ppl[i];
        dtmData.ibqFilmsSet.ExecSQL;
     except
        //
        end;

    finally
      dtmData.ibqFilmsGet.ParamByName('P2').AsString:=ppl[i];
      dtmData.ibqFilmsGet.Open;
      ppl.Objects[i]:=pointer(dtmData.ibqFilmsGet.Fields[0].AsInteger);
    end;//try-for

У тебя finally работает. Но только включая самое первое исключение. После него цикл прерывается и дальше цикл просто не выполняется.
Добавь try except end чтобы подавить исключительную ситуацию и все заработает. А вообще я бы так не делал. Сделал бы это в хранимой процедуре на сервере. Ну да ладно... Или добавил бы в except еще проверку на то, что это именно нарушение ключа, а не какая-то другая ошибка (потеря коннекта с базой, например).

except
 On E: <соответствующий тип ошибки>
 if E.ErrorCode <> 805 then //это приблизительная идея
   raise;
end;


Romkin   (2004-04-15 20:36:00) [2]

Все-таки матчасть - великое дело. Кто сказал, что finally выполняется только при исключении?!!! finally - end выполняется всегда, было исключение или нет!


Jack128   (2004-04-15 19:29:00) [3]


> bqFilmsSet
> bqFilmsGet
прочитал, прозрел -))

Так, что говорит трассировка, прям таки, что здесь исключение

> dtmData.ibqFilmsSet.ExecSQL;
а блок finally - побоку?? Не верю!!! :-) Скорее у тебя возникнет исключение здесь dtmData.ibqFilmsGet.Openпри попытке открыть уже открытый dataset


Anatoly Podgoretsky   (2004-04-15 19:13:00) [4]

Jack128 ©   (15.04.04 18:56) [6]
Очень может, это просто разные запросы, автор конечно постарался всех запутать, а сколько у него из за этого может проблем возникнуть в разработке или сопровождении :-)


Vlad   (2004-04-15 19:05:00) [5]


> Jack128 ©   (15.04.04 18:56) [6]

Читай внимательнее
bqFilms Set
bqFilms Get


miwa   (2004-04-15 19:01:00) [6]


> что вообще хочеш получить?

Хочу получить ID записи В ЛЮБОМ СЛУЧАЕ: есть она в базе, или нет. Тоесть, если запись есть - срабатывает исключение, управление переходит на блок файнэлли и выполняется код для получения айди. Ну, и если запись успешно вставляется, то управление переходит уже в обычном порядке на файнэлли и - тоже получаю айди.
Да, если поможет. Сами запросы выглядят примерно так:
('INSERT INTO persons (person_name) VALUES (:P1);');

('SELECT person_id FROM persons WHERE person_name = :P2')


Jack128   (2004-04-15 18:56:00) [7]


> Неа, Женя, запросы разные, хотя и разница составляет всего
> одну букву ;о)).
мдя? Как это одна буква может изменить запрос с например Insert'а на селект?  

> ];
>        dtmData.ibqFilmsSet.ExecSQL;
И вообще, ты тут часть кода вырезал, раз строчкой выше запрос отличается от запроса строчкой ниже..
>      finally
>        dtmData.ibqFilmsGet.ParamByName('P2').AsString:=ppl[i];


Соловьев   (2004-04-15 18:54:00) [8]


> miwa ©   (15.04.04 18:32)  

что вообще хочеш получить?

> Соловьев ©   (15.04.04 18:52) [3]

хотя, забираю назад слова...


Соловьев   (2004-04-15 18:52:00) [9]


> finally

учите мат часть
try

except
end


Vlad   (2004-04-15 18:52:00) [10]


> miwa ©   (15.04.04 18:49) [2]

Я тоже сначала не разглядел что это разные запросы ;-)
А отключить Stop on Delphi Exceptions не помогает ?


miwa   (2004-04-15 18:49:00) [11]

Неа, Женя, запросы разные, хотя и разница составляет всего одну букву ;о)).

И исключение возникает когда я пробую добавить дублирующую запись - в строке

> dtmData.ibqFilmsSet.ExecSQL;

а не в приведенных.


Jack128   (2004-04-15 18:39:00) [12]

Хе, любопытно, а как ты это один и тот же запрос и ExecSQL и Open ??

А строка
> ppl.Objects[i]:=pointer(dtmData.ibqFilmsGet.Fields[0].AsInteger
может не сработать, если в одной из строк

> dtmData.ibqFilmsGet.ParamByName('P2').AsString:=ppl[i];
>        dtmData.ibqFilmsGet.Open;
исключение...


Наверх

Титульная страница Поиск, карта сайта Написать письмо