Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизПриведенный код выдает -805-ю ошибку Найти похожие ветки
← →
miwa © (2004-04-15 18:32) [0]
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 не срабатывает, я просто получаю ошибку доступа к первичному ключу или уникальному полю. Почему?
← →
miwa © (2004-04-15 18:32) [0]
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 не срабатывает, я просто получаю ошибку доступа к первичному ключу или уникальному полю. Почему?
← →
Jack128 © (2004-04-15 18:39) [1]Хе, любопытно, а как ты это один и тот же запрос и ExecSQL и Open ??
А строка
> ppl.Objects[i]:=pointer(dtmData.ibqFilmsGet.Fields[0].AsInteger
может не сработать, если в одной из строк
> dtmData.ibqFilmsGet.ParamByName("P2").AsString:=ppl[i];
> dtmData.ibqFilmsGet.Open;
исключение...
← →
Jack128 © (2004-04-15 18:39) [1]Хе, любопытно, а как ты это один и тот же запрос и ExecSQL и Open ??
А строка
> ppl.Objects[i]:=pointer(dtmData.ibqFilmsGet.Fields[0].AsInteger
может не сработать, если в одной из строк
> dtmData.ibqFilmsGet.ParamByName("P2").AsString:=ppl[i];
> dtmData.ibqFilmsGet.Open;
исключение...
← →
miwa © (2004-04-15 18:49) [2]Неа, Женя, запросы разные, хотя и разница составляет всего одну букву ;о)).
И исключение возникает когда я пробую добавить дублирующую запись - в строке
> dtmData.ibqFilmsSet.ExecSQL;
а не в приведенных.
← →
miwa © (2004-04-15 18:49) [2]Неа, Женя, запросы разные, хотя и разница составляет всего одну букву ;о)).
И исключение возникает когда я пробую добавить дублирующую запись - в строке
> dtmData.ibqFilmsSet.ExecSQL;
а не в приведенных.
← →
Соловьев © (2004-04-15 18:52) [3]
> finally
учите мат часть
try
except
end
← →
Соловьев © (2004-04-15 18:52) [3]
> finally
учите мат часть
try
except
end
← →
Vlad © (2004-04-15 18:52) [4]
> miwa © (15.04.04 18:49) [2]
Я тоже сначала не разглядел что это разные запросы ;-)
А отключить Stop on Delphi Exceptions не помогает ?
← →
Vlad © (2004-04-15 18:52) [4]
> miwa © (15.04.04 18:49) [2]
Я тоже сначала не разглядел что это разные запросы ;-)
А отключить Stop on Delphi Exceptions не помогает ?
← →
Соловьев © (2004-04-15 18:54) [5]
> miwa © (15.04.04 18:32)
что вообще хочеш получить?
> Соловьев © (15.04.04 18:52) [3]
хотя, забираю назад слова...
← →
Соловьев © (2004-04-15 18:54) [5]
> miwa © (15.04.04 18:32)
что вообще хочеш получить?
> Соловьев © (15.04.04 18:52) [3]
хотя, забираю назад слова...
← →
Jack128 © (2004-04-15 18:56) [6]
> Неа, Женя, запросы разные, хотя и разница составляет всего
> одну букву ;о)).
мдя? Как это одна буква может изменить запрос с например Insert"а на селект?
> ];
> dtmData.ibqFilmsSet.ExecSQL;
И вообще, ты тут часть кода вырезал, раз строчкой выше запрос отличается от запроса строчкой ниже..
> finally
> dtmData.ibqFilmsGet.ParamByName("P2").AsString:=ppl[i];
← →
Jack128 © (2004-04-15 18:56) [6]
> Неа, Женя, запросы разные, хотя и разница составляет всего
> одну букву ;о)).
мдя? Как это одна буква может изменить запрос с например Insert"а на селект?
> ];
> dtmData.ibqFilmsSet.ExecSQL;
И вообще, ты тут часть кода вырезал, раз строчкой выше запрос отличается от запроса строчкой ниже..
> finally
> dtmData.ibqFilmsGet.ParamByName("P2").AsString:=ppl[i];
← →
miwa © (2004-04-15 19:01) [7]
> что вообще хочеш получить?
Хочу получить ID записи В ЛЮБОМ СЛУЧАЕ: есть она в базе, или нет. Тоесть, если запись есть - срабатывает исключение, управление переходит на блок файнэлли и выполняется код для получения айди. Ну, и если запись успешно вставляется, то управление переходит уже в обычном порядке на файнэлли и - тоже получаю айди.
Да, если поможет. Сами запросы выглядят примерно так:("INSERT INTO persons (person_name) VALUES (:P1);");
("SELECT person_id FROM persons WHERE person_name = :P2")
← →
miwa © (2004-04-15 19:01) [7]
> что вообще хочеш получить?
Хочу получить ID записи В ЛЮБОМ СЛУЧАЕ: есть она в базе, или нет. Тоесть, если запись есть - срабатывает исключение, управление переходит на блок файнэлли и выполняется код для получения айди. Ну, и если запись успешно вставляется, то управление переходит уже в обычном порядке на файнэлли и - тоже получаю айди.
Да, если поможет. Сами запросы выглядят примерно так:("INSERT INTO persons (person_name) VALUES (:P1);");
("SELECT person_id FROM persons WHERE person_name = :P2")
← →
Vlad © (2004-04-15 19:05) [8]
> Jack128 © (15.04.04 18:56) [6]
Читай внимательнее
bqFilmsSet
bqFilmsGet
← →
Vlad © (2004-04-15 19:05) [8]
> Jack128 © (15.04.04 18:56) [6]
Читай внимательнее
bqFilmsSet
bqFilmsGet
← →
Anatoly Podgoretsky © (2004-04-15 19:13) [9]Jack128 © (15.04.04 18:56) [6]
Очень может, это просто разные запросы, автор конечно постарался всех запутать, а сколько у него из за этого может проблем возникнуть в разработке или сопровождении :-)
← →
Anatoly Podgoretsky © (2004-04-15 19:13) [9]Jack128 © (15.04.04 18:56) [6]
Очень может, это просто разные запросы, автор конечно постарался всех запутать, а сколько у него из за этого может проблем возникнуть в разработке или сопровождении :-)
← →
Jack128 © (2004-04-15 19:29) [10]
> bqFilmsSet
> bqFilmsGet
прочитал, прозрел -))
Так, что говорит трассировка, прям таки, что здесь исключение
> dtmData.ibqFilmsSet.ExecSQL;
а блок finally - побоку?? Не верю!!! :-) Скорее у тебя возникнет исключение здесь dtmData.ibqFilmsGet.Open при попытке открыть уже открытый dataset
← →
Jack128 © (2004-04-15 19:29) [10]
> bqFilmsSet
> bqFilmsGet
прочитал, прозрел -))
Так, что говорит трассировка, прям таки, что здесь исключение
> dtmData.ibqFilmsSet.ExecSQL;
а блок finally - побоку?? Не верю!!! :-) Скорее у тебя возникнет исключение здесь dtmData.ibqFilmsGet.Open при попытке открыть уже открытый dataset
← →
Romkin © (2004-04-15 20:36) [11]Все-таки матчасть - великое дело. Кто сказал, что finally выполняется только при исключении?!!! finally - end выполняется всегда, было исключение или нет!
← →
Romkin © (2004-04-15 20:36) [11]Все-таки матчасть - великое дело. Кто сказал, что finally выполняется только при исключении?!!! finally - end выполняется всегда, было исключение или нет!
← →
kaif © (2004-04-15 21:16) [12]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;
← →
kaif © (2004-04-15 21:16) [12]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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.043 c