powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
13 сообщений из 13, страница 1 из 1
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
    #32066109
Valisy Ushakoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Есть stored proc (MSSQL2k), которая деляет буквально следующее: создает временную таблицу, а затем делает INSERT, который обламывается с ошибкой "... column does not allow nulls. INSERT fails" (не суть важно в принципе).
Так вот, клиент (ADOStoredProc в Delphi 5) не получает exception. При этом, стоит закомментарить создание временной таблицы - исключение доходит. В чем дело?
...
Рейтинг: 0 / 0
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
    #32066112
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET NOCOUNT ON стоит в процедуре?
...
Рейтинг: 0 / 0
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
    #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
Как заставить сервер НЕ ПРОМОЛЧАТЬ про ошибку клиенту?
    #32066124
sergwsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ADO объект Command имеет коллекцию ошибок:
Код: plaintext
cmdTMP.ActiveConnection.Errors

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

SELECT * FROM XCubeLock WITH (TABLOCKX)

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

SELECT * FROM XCubeLock WITH (TABLOCKX)

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

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

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

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

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


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