Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Приведенный код выдает -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 не срабатывает, я просто получаю ошибку доступа к первичному ключу или уникальному полю. Почему?


 
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;

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


 
Соловьев ©   (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 не помогает ?


 
Соловьев ©   (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];


 
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


 
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


 
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;



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
1-1080094627
Andrew
2004-03-24 05:17
2004.04.11
Excel


14-1079469946
Andy BitOff
2004-03-16 23:45
2004.04.11
Почему вновь прибывшие на форум не жмут поиск?


1-1082451004
Никита
2004-04-20 12:50
2004.04.11
Чтение кода HTML


4-1075481587
Hotabich
2004-01-30 19:53
2004.04.11
Помещение картинки на форму


1-1082482168
просто Я
2004-04-20 21:29
2004.04.11
ComboBox1.Items.Delete(??????);