Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ответ от sqlexec... / 20 сообщений из 20, страница 1 из 1
12.04.2005, 10:54:23
    #33010057
Ded Banzai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Подскажите, плз. С помощью sqlexec выполняю INSERT в таблицу БД SQL. В таблице срабатывает INSERT TRIGGER и контролирует запись, код возврата sqlexec я анализирую, но TRIGGER еще выдает диагностику - что в записи не так через raiserror. Так вот, как получить это raiserror сообщение триггера?
Устроит подсказка типа "где посмотреть". Заранее спасибо.
...
Рейтинг: 0 / 0
12.04.2005, 10:57:50
    #33010068
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
SQLEXEC(nConnectionHandle, cSQLCommand, [CursorName] )
или в курсоре SQLRESULT
...
Рейтинг: 0 / 0
12.04.2005, 10:58:41
    #33010076
Диченка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Raiserror сервера ловится AERROR
...
Рейтинг: 0 / 0
12.04.2005, 12:29:08
    #33010365
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
To Диченко:
Можно поподробнее, мож пример какой, а ?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
12.04.2005, 12:34:13
    #33010393
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Код: plaintext
1.
2.
3.
4.
IF SQLExec(...)< 0 
	LOCAL laError( 1 )
	=AERROR(laError)
	*анализ содержимого массива laError на причину ошибки
ENDIF
...
Рейтинг: 0 / 0
12.04.2005, 12:51:11
    #33010459
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
А если SQLEXEC отработал правильно (>0) ?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
12.04.2005, 12:54:53
    #33010477
Диченка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Vladimir M Sklyar
А если SQLEXEC отработал правильно (>0) ?

Posted via ActualForum NNTP Server 1.1

1 - выполнение прошло успешно, 0 - все еще выполняется (для асинхронного режима)
...
Рейтинг: 0 / 0
12.04.2005, 13:07:18
    #33010541
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
"Диченко" <nospam@sql.ru>; сообщил/сообщила в новостях следующее: news:1460563@sql.ru...
> Vladimir M Sklyar
>
> А если SQLEXEC отработал правильно (>0) ?
>
> 1 - выполнение прошло успешно, 0 - все еще выполняется (для асинхронного режима)

Это понятно, но вопрос был про RAISERROR - как его отловить на клиенте ?
Например у пользователя нету прав на выполнение некой комманды, а выяснилось это по середине выполнения некой ХП, которая в свою очередь отработала правильно. Т.е. нада либо как-то завершить работу ХП с возвратом параметра через курсор (как предлагал LEAF) или ..... ?

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
12.04.2005, 13:16:26
    #33010573
Диченка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Vladimir M Sklyar
"Диченко" <nospam@sql.ru>; сообщил/сообщила в новостях следующее: news:1460563@sql.ru...
> Vladimir M Sklyar
>
> А если SQLEXEC отработал правильно (>0) ?
>
> 1 - выполнение прошло успешно, 0 - все еще выполняется (для асинхронного режима)

Это понятно, но вопрос был про RAISERROR - как его отловить на клиенте ?
Например у пользователя нету прав на выполнение некой комманды, а выяснилось это по середине выполнения некой ХП, которая в свою очередь отработала правильно. Т.е. нада либо как-то завершить работу ХП с возвратом параметра через курсор (как предлагал LEAF) или ..... ?

Posted via ActualForum NNTP Server 1.1

Если у пользователя нет прав на выполнение ХП, то после выполнения AERROR(laError), в laError[1,5] содержаться значение 229. А если RAISERROR был "запрограммирован" в ХП, например как

Код: plaintext
   RAISERROR('Внимание! Группа с таким наименованием уже существует!', 16 , 1 )

то laError[1,5] будет равен 50000

Следовательно, если sqlexec работает с ХП, целесообразней sqlexec завернуть в класс-оболочку, в которой обрабатывать реакцию поведения sqlexec. Внутри оболочки будет описана реакция sqlexec и на ошибку 229 и на 50000 и на все остальное, вплоть до критических ошибок, по которым нужно закрыть все формы, отключиться от сервера и выкинуть юзера.
...
Рейтинг: 0 / 0
12.04.2005, 13:20:42
    #33010593
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Кажеться я понял, нада крутить параметрами RAISERROR

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
12.04.2005, 13:21:00
    #33010596
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Владимир, дело в том, что либо выполнение Вашей XP будет прервано (по RIASERROR или в результате "штатной" ошибки сервера) - в этом случае SQLExec()<0 и текст ошибки через AERROR()

Либо Ваша ХП как-то обработает не критичную ошибку без прерывания выполнения. В этом случае SQLExec()>0 и определить тот факт, что произошла ошибка можно будет только по содержимому возвращаемого курсора. Тогда надо будет повторно выполнить SQLExec() для вытягивания с сервера причины ошибки. Возможно, тут Вам поможет SQLMoreResult()
...
Рейтинг: 0 / 0
18.05.2005, 11:01:20
    #33071411
GFrunze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
ДиченкоRaiserror сервера ловится AERROR
А как бы получить сам текст этого Raiserror?
...
Рейтинг: 0 / 0
18.05.2005, 11:17:52
    #33071477
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
GFrunze ДиченкоRaiserror сервера ловится AERROR
А как бы получить сам текст этого Raiserror?
Он будет там же, в массиве, сформированном по AERROR()

PS: Неужели так трудно прочитать HELP или просто посмотреть, что же именно вернет AERROR()?
...
Рейтинг: 0 / 0
18.05.2005, 11:21:32
    #33071489
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
После AERROR(lErr)
lErr[2] - Текст ошибки
С уважением, Алексей.
...
Рейтинг: 0 / 0
18.05.2005, 12:11:55
    #33071660
GFrunze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
ВладимирМ GFrunze ДиченкоRaiserror сервера ловится AERROR
А как бы получить сам текст этого Raiserror?
Он будет там же, в массиве, сформированном по AERROR()

PS: Неужели так трудно прочитать HELP или просто посмотреть, что же именно вернет AERROR()?
В SQL процедуре есть фрагмент :
Код: plaintext
1.
2.
...
      raiserror( 'бла-бла-бла',  16 ,  1 )
...
Ни в одном из 7 полей AERROR() я не получаю этот текст 'бла-бла-бла'
...
Рейтинг: 0 / 0
18.05.2005, 12:53:29
    #33071790
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
А ЧТО получил?

Приведи полностью содержимое всех элементов полученного массива.

Учти, что твой текст там будет не в чистом виде, а обрамлен другим текстом, указывающим на то, откуда этот текст вообще взялся.
...
Рейтинг: 0 / 0
18.05.2005, 14:22:08
    #33072175
GFrunze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
ВладимирМА ЧТО получил?

Приведи полностью содержимое всех элементов полученного массива.

Учти, что твой текст там будет не в чистом виде, а обрамлен другим текстом, указывающим на то, откуда этот текст вообще взялся.

SQL процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
alter procedure p_otladka_tempo
  as
set nocount on
select  * from pubs..employee
if @@RowCount > 0 
    begin
      raiserror('бла-бла-бла',  16 ,  1 )
    end

FOXPRO prg:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
clear
Public  gnConnHandle
=rabota()
close data
return

Procedure rabota
=Conect()
rez=SQLEXEC(gnConnHandle,'exec master..p_otladka_tempo' ,'Q')
IF rez< 0 
	LOCAL laError( 1 )
	=AERROR(laError)
    CLEAR
    FOR n =  1  TO  7   
      ? laError(n)
    ENDFOR
 else
  brow
ENDIF
= Deconect()
return


Procedure Conect 
STORE SQLCONNECT('Server4' ,'SQLappl','APpassW') TO gnConnHandle
IF gnConnHandle <  0 
wait window 'not communication'
    return
Endif
return

Procedure Deconect 
    = SQLDISCONNECT(gnConnHandle)
return

Результат :
Код: plaintext
1.
2.
3.
4.
5.
6.
    1526 
Connectivity error.Unable to retrieve specific error information. Driver is probably out of resources
.NULL.
.NULL.
.NULL.
.NULL.
.NULL.
...
Рейтинг: 0 / 0
18.05.2005, 15:07:49
    #33072378
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Ничего себе! Вы отлаживаетесь в базе "master"?! Это круто! Это по нашему! Это действительно "бла-бла-бла"! По другому не скажешь.

Ну, а если по сути, то тут нет ошибки. В вашей процедуре получается следующее:

Выполняется запрос

select * from pubs..employee

И его результат немедленно отправляется клиенту! А куда же еще? Вы ведь не написали куда его направить! Настройка SET NOCOUNT ON всего-лишь предотвращает отображение информации о том, сколько записей было выбрано в этом запросе.

А вот после успешной отправки результата запроса отправляется еще и прерывание с сообщением об ошибке! А куда его вставить? FoxPro ведь по умолчанию рассчитывает принять только один результат! Вот и происходит наложение 2 возвращаемых значений с непредсказуемым результатом.

Измените свой код хотя бы так:

Код: plaintext
1.
2.
3.
4.
5.
CREATE PROCEDURE p_otladka_tempo
  as
set nocount on
select  * into #test from pubs..employee 
if @@RowCount > 0  RAISERROR('Пример текста об ошибке', 16 , 1 )
GO

Смысл в том, чтобы клиенту было ДО команды RAISERROR() не было послано никаких сообщений.
...
Рейтинг: 0 / 0
18.05.2005, 15:25:39
    #33072460
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
А если такой вот классический пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
clear all
h=SQLCONNECT()
IF h> 0 
  IF SQLEXEC(H,[SELECT  1  WHERE  1 = 0 ;
   IF @@ROWCOUNT= 0 ;
     RAISERROR('nothing to do', 16 , 1 );
   ])< 0 
  =AERROR(aODBC)
  DISPLAY MEMORY LIKE aODBC
  ENDIF
  =SQLDISCONNECT(h)
ENDIF
...
Рейтинг: 0 / 0
18.05.2005, 18:02:31
    #33073002
GFrunze
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ответ от sqlexec...
Sergey ChА если такой вот классический пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
clear all
h=SQLCONNECT()
IF h> 0 
  IF SQLEXEC(H,[SELECT  1  WHERE  1 = 0 ;
   IF @@ROWCOUNT= 0 ;
     RAISERROR('nothing to do', 16 , 1 );
   ])< 0 
  =AERROR(aODBC)
  DISPLAY MEMORY LIKE aODBC
  ENDIF
  =SQLDISCONNECT(h)
ENDIF

И где же этот 'nothing to do'?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ответ от sqlexec... / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]