![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приведенный код выдает -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;
исключение...