Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.036 c
6-1079823666
Автор
2004-03-21 02:01
2004.05.09
Как программе использовать для вычислений несколько компов в сети


6-1079489907
Gym
2004-03-17 05:18
2004.05.09
TIdFTPServer.OnStoreFile


1-1082716668
ANDRENO
2004-04-23 14:37
2004.05.09
Как впихнуть ресурс


4-1079956507
Yourik
2004-03-22 14:55
2004.05.09
Криптография, CryptGenKey(), CryptEncrypt()... etc


1-1082613534
AleKo
2004-04-22 09:58
2004.05.09
Outlook Express





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский