Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Вниз

Почему IF @@ERROR <> 0 не выполняется   Найти похожие ветки 

 
vedem ©   (2006-09-19 17:50) [40]


> Ega23 ©   (19.09.06 16:34) [33]
> Есть идея.
> Оформить сабжевый код в виде ХП, при возникновении ошибки
> добавлять инфу в таблицу ошибок, возвращать id этой ошибочной
> записи через return?


> sniknik ©   (19.09.06 16:12) [27]
> кстати могу предложить "решение"

Вы его проверяли?

Может я чего-то не догоняю, но

procedure TForm3.Button3Click(Sender: TObject);
begin
//делаем таблицу

ADOCommand1.CommandText:=
"create table t (id int identity primary key, msg varchar(255))";
ADOCommand1.Execute;

//после выполняем подряд

ADOCommand1.CommandText:=
"SET NOCOUNT OFF "+
"DELETE FROM T "+
"UPDATE authors SET au_id = ""172 32 1176"" "+
"WHERE au_id = ""172-32-1176"" "+
"IF @@ERROR = 547 "+
"  insert into t values(""A check constraint violation occurred"")  "+
"ELSE  "+
"  insert into t values(""Все ОК!"")";
ADOCommand1.Execute;

ADODataSet1.CommandText:= "SELECT * FROM t";
ADODataSet1.Open;

//любуемся на результат (т.к. больше, кроме самолюбования, смысла в нем нет)

end;

при этом, свойства
ADOCommand1.Connection и
ADODataSet1.Connection
привязаны к ADOConnection1,
DataSource1.Dataset := ADODataSet1
DBGrid1.DataSource := DataSource1

НУ НЕТУ В ГРИДЕ ТОГО САМОГО ДАТАСЕТА!


> Ega23 ©   (19.09.06 16:34) [33]
> Есть идея.
> Оформить сабжевый код в виде ХП, при возникновении ошибки
> добавлять инфу в таблицу ошибок, возвращать id этой ошибочной
> записи через return?

Все замечательно! До недавнего времени я считал что все работает на ура... НО! при отработке ХП и при связке BDS+ADO+MSSQL (в D7+ZEOS+MSSQL у меня все работало...) и возникновении критической ошибки в теле ХП, ХП будет прервана в процессе выполнения и добавлять инфу в таблицу ошибок не представляется возможным! Собственно с чем и борьба и вопрос о том же, только поставленный в соответствии с примерами из BOL.


 
ANB ©   (2006-09-19 17:57) [41]


> ADOCommand1.Execute;


Вот сюда sleep(5000) поставь и все заработает :)


> ADODataSet1.CommandText:= "SELECT * FROM t";
> ADODataSet1.Open;



> Все замечательно!

Не кипятись. Года 2 назад у меня вылезла эта проблема на боевом проекте. Здесь любители связки ADO+MS SQL, сказали мне, что я дурак и не умею готовить ADO. Проблема решилась только через DBLIB. :)
Кстати, BOL не описывает работу ADO. В нем грамотно разжевана работа сервера. В ADO.NET, повторюсь, проблема исправлена. Проверено лично.


 
vedem ©   (2006-09-19 17:57) [42]

Сейчас попробую сварганить ХП примерно с тем результатом...


 
vedem ©   (2006-09-19 18:09) [43]

И слип не помогает :(
procedure TForm3.Button3Click(Sender: TObject);
begin
 // Проверим коннект к нашей любимой базе....
 ADOQuery1.SQL.Text := "select * from authors";
 ADOQuery1.Open;
 // Тормознем до нажатия оки...
 ShowMessage("Жду кнопку... Датасет увидел....");
 DataSource1.DataSet := ADODataSet1;

//делаем таблицу

ADOCommand1.CommandText:=
"create table t (id int identity primary key, msg varchar(255))";
ADOCommand1.Execute;

//после выполняем подряд

ADOCommand1.CommandText:=
"SET NOCOUNT OFF "+
"DELETE FROM T "+
"UPDATE authors SET au_id = ""172 32 1176"" "+
"WHERE au_id = ""172-32-1176"" "+
"IF @@ERROR = 547 "+
"  insert into t values(""A check constraint violation occurred"")  "+
"ELSE  "+
"  insert into t values(""Все ОК!"")";
ADOCommand1.Execute;
sleep(5000);

ADODataSet1.CommandText:= "SELECT * FROM t";
ADODataSet1.Open;

//любуемся на результат (т.к. больше, кроме самолюбования, смысла в нем нет)

end;


кроме Exception
There is already an object named "t" in the database.
к сожалению больше ничего нет....


 
stud ©   (2006-09-19 18:12) [44]

vedem ©   (19.09.06 18:09) [43]
"SET NOCOUNT OFF "+
"DELETE FROM T "+
"UPDATE authors SET au_id = ""172 32 1176"" "+
"WHERE au_id = ""172-32-1176"" "+
"IF @@ERROR = 547 "+
"  insert into t values(""A check constraint violation occurred"")  "+
"ELSE  "+
"  insert into t values(""Все ОК!"")";

очевидно это код нужно оформить в виде хп на сервере, в противном случае до иферор дело не дойдет


 
vedem ©   (2006-09-19 18:15) [45]

Я не кипячусь, но хотелось бы рародится... Тем более что во-первых я доказываю что через ZEOS это работает (см DBLIB) а во-вторых при работе через ADO это черевато не выполнением до конца ХП, в следствии чего могут быть проблемы с транзакциями, открытыми в ХП, обработанными там же, но по Exception прерванными в процессе выполнения.

На транзакции проверял, вроде при обломе происходит Rollback, но на http://sql.ru мелькали темы по поводу проверки на @@trancount


 
sniknik ©   (2006-09-19 18:16) [46]

> Вы его проверяли?
> ...
> НУ НЕТУ В ГРИДЕ ТОГО САМОГО ДАТАСЕТА!
специально для вас  
http://img239.imageshack.us/img239/6469/lammh7.jpg

код взят as is из [40], без единого символа изменений. (кстати надеюсь понимаеш что создание таблицы (первый exec) при нажатии второй раз даст ошибку и код на ней прервется т.к. не защищен никакими try except?

оба, пока писал, да картинку делал...
> кроме Exception
> There is already an object named "t" in the database.
> к сожалению больше ничего нет....
вот и оно ;о))


 
vedem ©   (2006-09-19 18:16) [47]


> stud ©   (19.09.06 18:12) [44]
> vedem ©   (19.09.06 18:09) [43]
> "SET NOCOUNT OFF "+
> "DELETE FROM T "+
> "UPDATE authors SET au_id = ""172 32 1176"" "+
> "WHERE au_id = ""172-32-1176"" "+
> "IF @@ERROR = 547 "+
> "  insert into t values(""A check constraint violation occurred"")
>  "+
> "ELSE  "+
> "  insert into t values(""Все ОК!"")";
> очевидно это код нужно оформить в виде хп на сервере, в
> противном случае до иферор дело не дойдет

Есть и ХП... Результат тот-же.... Собственно вопрос и возник после выявления что ХП не проработала до конца.


 
sniknik ©   (2006-09-19 18:18) [48]

> очевидно это код нужно оформить в виде хп на сервере
ничего не надо, все рабчее как есть. (ну кроме минимума знаний... ;о))


 
ANB ©   (2006-09-19 18:44) [49]


> sniknik ©   (19.09.06 18:16) [46]

Слип небось воткнул :) Так нечестно.


 
vedem ©   (2006-09-19 18:58) [50]

Спасибо sniknik
Что-то получилось, но не честно... :)

procedure TForm3.Button3Click(Sender: TObject);
begin

 // Проверим коннект к нашей любимой базе....
 ADOQuery1.SQL.Text := "select * from authors";
 ADOQuery1.Open;
 // Тормознем до нажатия оки...
 ShowMessage("Жду кнопку... Датасет увидел....");
 DataSource1.DataSet := ADODataSet1;

//делаем таблицу

 ADOCommand1.CommandText:=
 "create table t (msg varchar(255))";
 try
   ADOCommand1.Execute;
 except
 end;

//после выполняем подряд

 ADOCommand1.CommandText:=
   "SET NOCOUNT OFF "+
   "DELETE FROM t "+
   "UPDATE authors SET au_id = ""172 32 1176"" "+
   "WHERE au_id = ""172-32-1176"" "+
   "IF @@ERROR = 547 "+
   "  insert into t values(""A check constraint violation occurred"")  "+
   "ELSE  "+
   "  insert into t values(""Все ОК!"")";
 try
   ADOCommand1.Execute;
   sleep(5000);
 except
   on E: Exception do ShowMessage(E.Message);
 end;

 ADODataSet1.CommandText:= "SELECT * FROM t";
 ADODataSet1.Open;

//любуемся на результат (т.к. больше, кроме самолюбования, смысла в нем нет)

end;


но к сожалению, при

declare @t table (msg varchar(255))
....
SELECT * FROM @t


проблема осталась...

Обход окольными путями того что работает в QA не есть гуд...

Будем дальше работать над едим вопросом, но уже в фонововм режиме.

Еще раз спасибо sniknik и всем кто принял участие.


 
ANB ©   (2006-09-19 19:03) [51]


> declare @t table (msg varchar(255))
> ....
> SELECT * FROM @t

Это потому что паузу в одну команду не воткнешь :) А в разных - @t уже не существует


 
vedem ©   (2006-09-19 19:09) [52]

А как же работает эта сволочь под название Query Analyzer....


 
sniknik ©   (2006-09-19 20:36) [53]

ANB ©   (19.09.06 18:44) [49]
> Слип небось воткнул :) Так нечестно.
повторяю, все рабочее как есть, и было с первого и единственного моего примера... на картинке видно кстати, специально так "снял" чтобы видно было.

слип и ничего более, кроме показаного в первый же раз, не нужно.

vedem ©   (19.09.06 18:58) [50]
> но к сожалению, при
> declare @t table (msg varchar(255))
> ....
> SELECT * FROM @t
> проблема осталась...
а подумать? или на @t свет клином сошолся? а ведь есть же еще и #t

> Будем дальше работать над едим вопросом, но уже в фонововм режиме.
лучше бы думал и работал над задачей, чем над проблемами неудачной реализации.

vedem ©   (19.09.06 19:09) [52]
> А как же работает эта сволочь под название Query Analyzer....
например выполняя пакет покомандно (подозреваю что и dblib ранее упоминавшийся также работает (если работает. не проверял)). и который кстати пишет, что на этой конкретной строке батч "терминирован"


 
sniknik ©   (2006-09-19 20:44) [54]

кстати
> ADOCommand1.CommandText:=
>  "create table t (msg varchar(255))";
>  try
>    ADOCommand1.Execute;
>  except
>  end;
зная что она есть... надеюсь это не рабочий проект? (и еше больше надеюсь что мне с ним столкнуться не придется ;о)))

вообще впечатление такое, что просто сами себе трудности выдумываете... жизнь скучна без них?
проблемы "мирового маштаба", которые ну никак по другому не решить только извратом, вернее так говорит автор... и тот же автор не может перевести(опознать) ошибку, о том что таблица уже создана... да это все одно что супер гонщик вдруг заявил "а чего это она не заводится? пишет бензина нет. чего ей надо?"... смешно.


 
Vedem ©   (2006-09-20 01:43) [55]

2 sniknik:
А при чем тут слип? и без него все работет..


> вообще впечатление такое, что просто сами себе трудности
> выдумываете... жизнь скучна без них?
> проблемы "мирового маштаба", которые ну никак по другому
> не решить только извратом, вернее так говорит автор... и
> тот же автор не может перевести(опознать) ошибку, о том
> что таблица уже создана... да это все одно что супер гонщик
> вдруг заявил "а чего это она не заводится? пишет бензина
> нет. чего ей надо?"... смешно.

ну тут вы немного парите...

Цитирую:
sniknik ©   (19.09.06 16:12) [27]

кстати могу предложить "решение"

т.к. выполнение скрипта прерывается только для внешнего источника, сервер то его все одно доделывает (иначе не могли бы работать тригера где это нужно и т.д.), а о прерывании QA явно пишет. то решение очевидно... или нет? ;о)
попросту сделай свою таблицу с сообщениями постоянной, ну и читай ее в другом блоке. типа
ВНИМАНИЕ, ЭТО ИЗВРАТ, ДЕЛАТЬ ТАК НЕ РЕКОМЕНДУЮ При чем тут автор?


>
> и тот же автор не может перевести(опознать) ошибку, о том
> что таблица уже создана...


sniknik ©   (19.09.06 18:16) [46]

> Вы его проверяли?
> ...
> НУ НЕТУ В ГРИДЕ ТОГО САМОГО ДАТАСЕТА!
специально для вас  
http://img239.imageshack.us/img239/6469/lammh7.jpg

код взят as is из [40], без единого символа изменений. (кстати надеюсь понимаеш что создание таблицы (первый exec) при нажатии второй раз даст ошибку и код на ней прервется т.к. не защищен никакими try except?

оба, пока писал, да картинку делал...
> кроме Exception
> There is already an object named "t" in the database.
> к сожалению больше ничего нет....
вот и оно ;о))

Ну вы опередили хвала вам! :)

Еще раз всем спасибо.


 
sniknik ©   (2006-09-20 02:57) [56]

> 2 sniknik:
> А при чем тут слип? и без него все работет..
не знаю при чем. у меня его не было.
но это ответ на
ANB ©   (19.09.06 18:44) [49]
> Слип небось воткнул :) Так нечестно.
и у тебя в коде он > sleep(5000); тоже присутствует

> ну тут вы немного парите...
в смысле? я вообщето не банщик, парить не умею. и что должны показать дальнейшие цитаты?

незнаю как ты это все понял, но это не решение, это бред не зря я его (слово решение) и в кавычках писал и предупреждения выделял, причем бред не код, он правильный, а сама идея ловить и игнорировать ексепт на сервере чтобы передать его на клиента куда он и так передается если бы не словили и не проигнорировали... во всяком случае до тех пор пока не будет соответствующих механизмов в sql сервере (которые опять таки не для того чтобы подменять полное сообщение своим урезанным...).

> При чем тут автор?
вот, при том тут автор, был нормальный код над плохим идеологически решением (нормальное показано в [22], которое по невнятным причинам не подходит... но типа, "верьте так надо. иначе не получится")
и вот тут этот автор еще и свои изменения кода делает... вместо оптимизации (проверки в скрипте на существование/переход на временные/вынос ставшего ненужным куска за блок/х.з. чего еще) просто берет и закрывает пустым try except... только потому что у меня он был упомянут? но заметь была не рекомендация, не совет, а просто факт -  "не закрытое вылетает".  (не знает как по другому? а раз упомянули... не думаем, делаем так)
т.е. с одной стороны неграмотность в элементарных вопросах, с другой претензия на проблему "мирового маштаба", в чем я лично сомневаюсь. просто думаю если человек неспособен даже запрос грамотно составить то уж продумать схему взаимодействий сервера с клиентом и подавно. (если не знаеш, что и как действует, то как этим рулить?)
вот и аналогия про "супер гонщика".

а вот реальный совет

>> Будем дальше работать над едим вопросом, но уже в фонововм режиме.
> лучше бы думал и работал над задачей, чем над проблемами неудачной реализации.
игнорируется, а ведь это самый лучший совет во всей ветке....



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

Форум: "Базы";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.1 c
4-1152100832
ILIA82
2006-07-05 16:00
2006.11.19
права доступа в NTFS


1-1160572979
guav
2006-10-11 17:22
2006.11.19
forward declaration для процедурных типов


15-1160849771
Chort
2006-10-14 22:16
2006.11.19
какие фильмы посоветуете с ниженаписанного списка?


3-1158326339
-=Tiger=-
2006-09-15 17:18
2006.11.19
Перемещение записей в ADOTable


4-1152189062
Серге И
2006-07-06 16:31
2006.11.19
Определение температуры на материнской плате с двумя процессорами





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский