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

Вниз

Почему 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.65 MB
Время: 0.042 c
2-1161852736
Shell
2006-10-26 12:52
2006.11.19
Как открыть программу


2-1162711192
HumanToString
2006-11-05 10:19
2006.11.19
Проверить значение первого символа


3-1158649941
PEAKTOP
2006-09-19 11:12
2006.11.19
BLOB+HTML


2-1162468879
bns
2006-11-02 15:01
2006.11.19
Record в class


15-1162206003
maxmax111
2006-10-30 14:00
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский