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

Вниз

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

 
Vedem ©   (2006-09-18 17:56) [0]

Берем пример из BOL и немного его модифицируем
Examples
A. Use @@ERROR to detect a specific error
This example uses @@ERROR to check for a check constraint violation (error #547) in an UPDATE statement.

use pubs
go

declare @t table (msg varchar(255))

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("Все ОК!")

SELECT * FROM @t


Задача в следующем:
Нужно вернуть сообщения (и о нормальной работе и о возникших ошибках) в датасете.

При выполнении запроса в QA получаем 2 вкладки Grids и Messages

Messages:

Server: Msg 547, Level 16, State 1, Line 1
UPDATE statement conflicted with COLUMN CHECK constraint "CK__authors__au_id__77BFCB91".
The conflict occurred in database "pubs", table "authors", column "au_id".
The statement has been terminated.

(1 row(s) affected)

(1 row(s) affected)

Grids:

A check constraint violation occurred

При выполнении этого же запроса из приложения имеем Exception

UPDATE statement conflicted with COLUMN CHECK constraint "CK__authors__au_id__77BFCB91".
The conflict occurred in database "pubs", table "authors", column "au_id".
и отсутствие датасета.

То же самое произходит при выполнении ХП, при наличии ошибки выполнение ХП прерывается.

Вопрос: как получить датасет не зависимо от наличия ошибки?

BDS2006 + ADO + MSSQL 2000


 
stud ©   (2006-09-18 17:59) [1]

Vedem ©   (18.09.06 17:56)
Вопрос: как получить датасет не зависимо от наличия ошибки?

а какой датасет при update??


 
vedem ©   (2006-09-18 18:05) [2]

SELECT * FROM @t
в конце запроса....


 
ANB ©   (2006-09-18 18:05) [3]


> stud ©   (18.09.06 17:59) [1]

Последним идет селект.


> Вопрос: как получить датасет не зависимо от наличия ошибки?

Это глюк АДО. Он не дожидается завершения пакета / ХП считая первую же ошибку исключением. Лезь к серверу напрямую (например, используя DBLIB). Впрочем, может спецы по АДО подскажут лучшее решение ?


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

Из-за пары запросов менять средсво доступа - как-то не прикольно.
Проверял это на BDE, ODBC - результат тот же.
При использовании компонет Zeos, при "прямом доступе" (собственно посредством DBLIB) - работает как надо.
Неужели в АДО нет средств настроить нужное поведение?


 
Ega23 ©   (2006-09-18 18:19) [5]

Begin tran ....
.....
if @@ERROR<>0 Goto RollBackTran

.......

Commit Tran
Goto Fin

:RollBackTran
RollBack Tran ....
Goto Fin

:Fin
Select * from ....


Не проверял, но вроде принудительных Raiserror нету....


 
vedem ©   (2006-09-18 18:25) [6]

declare @t table (msg varchar(255))

begin tran
UPDATE authors SET au_id = "172 32 1176"
WHERE au_id = "172-32-1176"
IF @@ERROR = 547 begin
  Rollback tran
  insert into @t values("A check constraint violation occurred")
end ELSE begin
commit tran
  insert into @t values("Все ОК!")
end

SELECT * FROM @t


результат тот=же :(


 
Ega23 ©   (2006-09-18 18:46) [7]

Хрен его знает. А если как ХП оформить с ouput-параметром?


 
stud ©   (2006-09-18 18:48) [8]

так может проще проверку сделать на наличие /отсутствие нужной записи?
чтобы без исключений


 
Fay ©   (2006-09-18 18:49) [9]

set xact_abort off


 
Ega23 ©   (2006-09-18 19:13) [10]


> так может проще проверку сделать на наличие /отсутствие
> нужной записи?


Ты посмотри внимательней, там check на constraint наложен


> set xact_abort off


Не поможет, один хрен raise идёт...


 
Fay ©   (2006-09-18 19:36) [11]

Тогда делаем финт с "лишним" recordset-ом
set nocount OFF
....


 
Fay ©   (2006-09-18 19:37) [12]

Не, нифига... 8))


 
Ega23 ©   (2006-09-18 19:46) [13]


> Тогда делаем финт с "лишним" recordset-ом
> set nocount OFF


Это я уже проверил, не канает...  :о)
Только сообщение на insert уберёт...


 
Fay ©   (2006-09-18 19:54) [14]

Примерно так
use pubs
go
set xact_abort off

declare @t table (msg varchar(255))

begin tran

UPDATE authors SET au_id = "172 32 1176"
WHERE au_id = "172-32-1176"

IF @@ERROR = 0 begin
 commit tran      
 insert into @t values("OK!")
end ELSE begin
 rollback tran      
 insert into @t values("Fuck!")
end

SELECT * FROM @t


 
Ega23 ©   (2006-09-18 19:56) [15]


> Fay ©   (18.09.06 19:54) [14]


Ну и что? первым всё равно сообщение об ошибке в QA идёт, как ни крутись...


 
Zz_   (2006-09-18 19:57) [16]

>>Вопрос: как получить датасет не зависимо от наличия ошибки?

Посмотреть NextRecordset


 
Fay ©   (2006-09-18 20:11) [17]

2 Ega23 ©   (18.09.06 19:56) [15]
Проверял?


 
Fay ©   (2006-09-18 20:16) [18]

А на самом деле, надо не трахать себе мозги, а либо перейти на MSSQL 2005, либо юзать AnyDAC


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

интересная ветка по теме (и в конце ее еще ссылка)
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=277446&pg=1&hl=error+%ef%f0%ee%e4%ee%eb%e6%e8%f2%fc+%e2%fb%ef%ee%eb%ed%e5%ed%e8%e5


 
vedem ©   (2006-09-19 15:25) [20]


> Хрен его знает. А если как ХП оформить с ouput-параметром?

результат тот же :(

> Fay ©   (18.09.06 18:49) [9]
> set xact_abort off

добровольно-принудительно выполняю перед запросом
 ADOConnection1.Execute("SET XACT_ABORT OFF");



> stud ©   (18.09.06 18:48) [8]
> так может проще проверку сделать на наличие /отсутствие
> нужной записи?
> чтобы без исключений

Задача на предварительную проверку возможности удаления записей, пример приведен для проверки и подобное есть в BOL
Мне нужно чтоб был возврат датасета, при RecordCount = 0 - считается что можно убить все записи по условию.
Но не будем вглублятся в нужный мне алгоритм, есть пример BOL, и он не работает... :(

> Zz_   (18.09.06 19:57) [16]
> >>Вопрос: как получить датасет не зависимо от наличия ошибки?
>
>
> Посмотреть NextRecordset

Попробую...


> sniknik ©   (18.09.06 20:45) [19]
> интересная ветка по теме (и в конце ее еще ссылка)
> http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=277446&pg=1&hl=error+%ef%f0%ee%e4%ee%eb%e6%e8%f2%fc+%e2%fb%ef%ee%eb%ed%e5%ed%e8%e5
> <Цитата>

Последний мой вопрос, так и оставшийся без ответа...


 
Ega23 ©   (2006-09-19 15:32) [21]


> интересная ветка по теме (и в конце ее еще ссылка)


Очень интересная ветка.
Но проблема так и не решена.
Кстати, вот ещё что в голову пришло: а если текстовую информацию об ошибке через Raiserror передавать?


 
sniknik ©   (2006-09-19 15:43) [22]

> Последний мой вопрос, так и оставшийся без ответа...
почему это без ответа? ясно же сказали, что так делать нельзя (в последней ссылке вроде), по крайней мере до 2005 в котором появилась обработка исключений аналогичная дельфевской try except.

> Но проблема так и не решена.
??? а это вообще разве нужно?
try
 ADOCommand.CommandText:=
   "UPDATE authors SET au_id = ""172 32 1176"" "
   "WHERE au_id = ""172-32-1176""";
 ADOCommand.Execute;

 sInfo:= "Все ОК!";
except
 on E: Exception do  
   sInfo:= "A check constraint violation occurred. With message : " + E.Message;
end;


 
vedem ©   (2006-09-19 15:58) [23]


> Ega23 ©   (19.09.06 15:32) [21]
>
> > интересная ветка по теме (и в конце ее еще ссылка)
>
>
> Очень интересная ветка.
> Но проблема так и не решена.
> Кстати, вот ещё что в голову пришло: а если текстовую информацию
> об ошибке через Raiserror передавать?

Для того чтобы выдавать текстовую информацию через Raiserror в запросе, нужно хотябы проверить состояние @@ERROR. К сожалению при вызове запроса (или ХП) при ошибке прерывается выполнение запроса и вылезает Excetion. До выполнения IF @@ERROR.... дело не доходит... В Query Analizer, как было сказано в первом посте, имеем сообщение об ошибке и результирующий набор данных (или как в чистом примере в BOL - информационное сообщение)


 
vedem ©   (2006-09-19 16:02) [24]

2 sniknik
Мне нужно анализировать результат DataSet! В которм есть инфа о правильном результате или! о возникшей ошибке в процессе выполнения запроса.
Обращаю внимание, что в приведенном прмере в качестве набора данных возвращается только сообщение, в реали в датасете должна быть дополнительная инфа...


 
vedem ©   (2006-09-19 16:03) [25]

И к сожалению MSSQL сервер в задаче ограничен 2000 :(


 
Ega23 ©   (2006-09-19 16:11) [26]


> ??? а это вообще разве нужно?


Не, тут другое.
Интересует сам академический вопрос:
Возможно ли при возникновении исключения отписать куда-то информацию об этом исключении на серверной стороне?


 
sniknik ©   (2006-09-19 16:12) [27]

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

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

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

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

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

ADOCommand.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(""Все ОК!"")";
ADOCommand.Execute

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

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


 
Ega23 ©   (2006-09-19 16:12) [28]

Кстати: а если триггер?


 
Ega23 ©   (2006-09-19 16:14) [29]


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


Это не изврат, это в 2 транзакции. Это как раз не интересно.
Кстати, дропнуть t надо...


 
ANB ©   (2006-09-19 16:18) [30]


> До выполнения IF @@ERROR.... дело не доходит

Доходит. Но ты об этом не узнаешь, т.к. ADO прекращает связь с сервером. Я ж грил - при прямом обращении - все ОК.

> ясно же сказали, что так делать нельзя

Можно. Но не через ADO.

> Возможно ли при возникновении исключения отписать куда-то
> информацию об этом исключении на серверной стороне?

Без проблем. Напиши такой же код, только с сохранением ошибки в обычную таблицу, выполни его и убедись, что запись в таблицу ляжет.
Проблема в том, что нужно отследить, когда процедура закончилась.
Она же может долго выполняться.


 
sniknik ©   (2006-09-19 16:20) [31]

про одну, в ссылках явно говорят что не поддерживается в 2000м.

> Кстати, дропнуть t надо...
зачем? она же ему постоянно нужна, ну пусть и пользуется.


 
stud ©   (2006-09-19 16:32) [32]

vedem ©   (19.09.06 15:25) [20]
Мне нужно чтоб был возврат датасета, при RecordCount = 0 - считается что можно убить все записи по условию.

так в примере по идее при любом раскладе будет 1 запись!?


 
Ega23 ©   (2006-09-19 16:34) [33]

Есть идея.
Оформить сабжевый код в виде ХП, при возникновении ошибки добавлять инфу в таблицу ошибок, возвращать id этой ошибочной записи через return?


 
stud ©   (2006-09-19 16:38) [34]

Ega23 ©   (19.09.06 16:34) [33]
возвращать id этой ошибочной записи через return?

так вроде до ретурна адо не доживет и его не получит.
как вариант:
в предложенную постоянную таблицу писать сообщения. в качестве ид - использовать spid "писателя".
перед выполнением запроса удалять данных с этим же спидом, после окончания читать по этому спиду.


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


> после окончания читать

здесь ключевое слово "после окончания". Взводит специальный флаг на сервере и опрашивать его в цикле - жутко криво.
Надо юзать ADO.NET. В нем нету этой проблемы. Или обращаться к серверу напрямую, без ADO, но это не очень просто.


 
stud ©   (2006-09-19 17:19) [36]

ANB ©   (19.09.06 17:09) [35]
Взводит специальный флаг на сервере и опрашивать его в цикле - жутко криво.

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


 
ANB ©   (2006-09-19 17:31) [37]


> читать сразу после выполнения операции.

А кто сказал, что инфа уже попала туда, куда надо ?

Пример :

update ....
...
много кода, который долго работает
update .... с ошибкой
...
много кода, который долго работает
update ....
много кода, который долго работает и есть принты
select

ну и как достать ошибку, результат последнего запроса и все принты ?


 
stud ©   (2006-09-19 17:39) [38]

ANB ©   (19.09.06 17:31) [37]
update ....
...
много кода, который долго работает
update .... с ошибкой
...
много кода, который долго работает
update ....
много кода, который долго работает и есть принты

а смысл последующих апдейтов, если не отработал первый?
тут после каждого апдейта нужно вставлять сообщение или менять его


 
ANB ©   (2006-09-19 17:48) [39]


> а смысл последующих апдейтов, если не отработал первый?

Массовая обработка, например, при конвертации данных. update можешь заменить на insert. Я работал с такими хранимками. Причем менять их было нельзя, нужно было только вызывать и аккуратно складывать результаты.


 
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;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.036 c
2-1162374315
dmdel
2006-11-01 12:45
2006.11.19
Округление чисел


2-1162054281
Ingwar
2006-10-28 20:51
2006.11.19
Как лучше сделать!


15-1162285919
Crazybeaver
2006-10-31 12:11
2006.11.19
Альтернатива FrontPage


2-1162193174
STARiK
2006-10-30 10:26
2006.11.19
Удаленное изменение структуры dbf


15-1162295245
serrgg
2006-10-31 14:47
2006.11.19
Как узнать версию Delphi в которой был создан проект?