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

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

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

Posted via ActualForum NNTP Server 1.1

1 - выполнение прошло успешно, 0 - все еще выполняется (для асинхронного режима)
...
Рейтинг: 0 / 0
Ответ от sqlexec...
    #33010541
Фотография 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
...
Рейтинг: 0 / 0
Ответ от sqlexec...
    #33010573
Фотография Диченка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Ответ от sqlexec...
    #33010593
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажеться я понял, нада крутить параметрами RAISERROR

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

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

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

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

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

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

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

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

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
Ответ от sqlexec...
    #33072378
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего себе! Вы отлаживаетесь в базе "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
Ответ от sqlexec...
    #33072460
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
...
Рейтинг: 0 / 0
Ответ от sqlexec...
    #33073002
GFrunze
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ответ от sqlexec...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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