Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту? / 13 сообщений из 13, страница 1 из 1
10.11.2002, 15:24:36
    #32066109
Valisy Ushakoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
Привет!
Есть stored proc (MSSQL2k), которая деляет буквально следующее: создает временную таблицу, а затем делает INSERT, который обламывается с ошибкой "... column does not allow nulls. INSERT fails" (не суть важно в принципе).
Так вот, клиент (ADOStoredProc в Delphi 5) не получает exception. При этом, стоит закомментарить создание временной таблицы - исключение доходит. В чем дело?
...
Рейтинг: 0 / 0
10.11.2002, 15:27:51
    #32066112
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
SET NOCOUNT ON стоит в процедуре?
...
Рейтинг: 0 / 0
10.11.2002, 15:48:20
    #32066121
Valisy Ushakoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
Ага.

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
ALTER PROC sp_CubeLock
	@AType		INT,  -- 0 - Read, 1 - Write
 
	@ACubeID	uniqueidentifier,
	@Result		INT OUTPUT
AS
SET NOCOUNT ON

DECLARE @pettytype INT, 
	@type INT, 
	@logintime DATETIME

CREATE TABLE #locks (
	cube_id		UNIQUEIDENTIFIER,
	locktype	TINYINT,
	spid		SMALLINT,
	sid		BINARY( 85 ),
	login_time	DATETIME,
	login_name	NCHAR( 128 ),
	hostname	NCHAR( 128 )
)

EXEC sp_CubeLockVerify

BEGIN TRAN

	IF (@AType =  0 ) 
	BEGIN	 -- Требуется доступ на чтение - проверяем блокировку на запись
 
		SET @pettytype	=  0 
		SET @type	=  1 
	END
	ELSE 	 -- Требуется доступ на запись - проверяем все блокировки
 
		SET @pettytype 	=  1 
	 -- Блокируем таблицу блокировок :-)
 
	SELECT * FROM XCubeLock WITH (TABLOCKX)

	SELECT @logintime = login_time FROM master.dbo.sysprocesses WHERE spid = @@SPID
					
	 -- Вытаскиваем блокировки указанного дерева
 
	INSERT INTO #locks
	SELECT 	CL.cube_id,
		CL.locktype,
		CL.spid, 
		SP.sid,
		CL.login_time,
		SP.loginame AS login_name,
		SP.hostname
	FROM	XCubeLock CL
		INNER JOIN
		master.dbo.sysprocesses SP 
			ON (SP.spid = CL.spid AND SP.login_time = CL.login_time)
	WHERE 	 CL.cube_id = @ACubeID AND
		(CL.locktype = @type OR @pettytype =  1 )
			
	IF (@@ROWCOUNT =  0 )
	BEGIN
		INSERT INTO XCubeLock
			(spid, login_time, cube_id, locktype)
		VALUES	(@@SPID, @logintime, @ACubeID, @AType)
		IF (@@ERROR <>  0 ) 
			SET @result =  0 
		ELSE
			SET @result =  1 
	END
	ELSE
		SET @result =  0 


	SELECT * FROM #locks
	DROP TABLE #locks

IF (@result =  1 ) 
	COMMIT TRAN
ELSE BEGIN
	ROLLBACK TRAN
	RAISERROR('Ошибка добавления записи о блокировке',  16 , - 1 )
END
GO


При вызове из ISQLW вида
Код: plaintext
exec sp_cubelock null, null, null

получаем следующее:
Код: plaintext
1.
2.
3.
4.
Server: Msg  515 , Level  16 , State  2 , Procedure sp_CubeLock, Line  58 
Cannot insert the value NULL into column 'locktype', table 'XCubeLock'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Server: Msg  50000 , Level  16 , State  1 , Procedure sp_CubeLock, Line  77 
Ошибка добавления записи о блокировке


В Delphi - тишина...
...
Рейтинг: 0 / 0
10.11.2002, 15:54:13
    #32066124
sergwsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
В ADO объект Command имеет коллекцию ошибок:
Код: plaintext
cmdTMP.ActiveConnection.Errors

ИМХО, там и ищите
...
Рейтинг: 0 / 0
10.11.2002, 16:18:17
    #32066130
Valisy Ushakoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
Однако ADOStoredProc2.Connection.Errors.Count = 0...
...
Рейтинг: 0 / 0
10.11.2002, 17:56:36
    #32066193
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
В Delphi по-умолчанию, получается только первый рекордсет и на этом все останавливается.

SELECT * FROM XCubeLock WITH (TABLOCKX)

Вот этот рекордсет получает Delphi, и считает свою миссию выполненной.
...
Рейтинг: 0 / 0
10.11.2002, 18:07:27
    #32066195
tpg
tpg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
Неа, надо обработку переменной @@error поставить после первого же инсерта и если она <>0 ветвиться на ROLLBACK.
...
Рейтинг: 0 / 0
10.11.2002, 18:11:27
    #32066197
sergwsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
А через выходной параметр передавать текст ошибки не пробывали?
...
Рейтинг: 0 / 0
10.11.2002, 18:30:37
    #32066205
Guest___
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
Попробуйте в скрипте SP явно прописать NOT NULL для полей создаваемой временной таблицы.
...
Рейтинг: 0 / 0
11.11.2002, 10:08:31
    #32066319
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
В Delphi по-умолчанию, получается только первый рекордсет и на этом все останавливается.

SELECT * FROM XCubeLock WITH (TABLOCKX)

Вот этот рекордсет получает Delphi, и считает свою миссию выполненной.

Неа, надо обработку переменной @@error поставить после первого же инсерта и если она <>0 ветвиться на ROLLBACK.

Еще раз. Delphi, получив вышеуказанный набор данных, остальной OUTPUT больше не считывает, чего бы там не было, вместе с ошибками. Исполнение процедуры, конечно же, не прерывается. Просто Delphi больше ничего не пытается прочесть из выходного потока. Поэтому, достаточно выкинуть этот SELECT (совершенно лишний), чтобы получать ошибку.
...
Рейтинг: 0 / 0
11.11.2002, 15:27:07
    #32066539
Valisy Ushakoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
Delphi, получив вышеуказанный набор данных, остальной OUTPUT больше не считывает, чего бы там не было, вместе с ошибками. Исполнение процедуры, конечно же, не прерывается. Просто Delphi больше ничего не пытается прочесть из выходного потока. Поэтому, достаточно выкинуть этот SELECT (совершенно лишний), чтобы получать ошибку.

Опытным путем дошел таки до этого :)

Остается только один вопрос: кто виноват? ADO или надстройка в Delphi?
...
Рейтинг: 0 / 0
11.11.2002, 16:39:50
    #32066585
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
ADO
...
Рейтинг: 0 / 0
11.11.2002, 16:45:54
    #32066586
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
Точнее, совместно, ADO и Delphi, поскольку в принципе возможно перебрать через NextRecordset весь output и добраться до ошибки, но почему-то разработчики Delphi об этом не озаботились. А ADO виновно в том, что могло бы само определить, что среди output имеется ошибка, и пнуть клиента вместо отдачи ему первого набора данных.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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