powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Коннектор к веб-службам. MS SQL 2000
24 сообщений из 24, страница 1 из 1
Коннектор к веб-службам. MS SQL 2000
    #35430111
YoriKim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На одном хосте нужно вызвать веб-службу из хранимой процедуры. Как это можно сделать в MS SQL 2000?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #35430188
Фотография Knyazev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp_OA...
ESP

???
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #35430198
YoriKim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
saop
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #35430204
YoriKim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
soap*
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #35430227
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YoriKimНа одном хосте нужно вызвать веб-службу из хранимой процедуры. Как это можно сделать в MS SQL 2000?Вариант - OLE Automation.
Вот код для примера на 2005м.
Код: sql
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.
CREATE PROCEDURE [dbo].[spSOAPMethodCall] (
	 @@URL		SysName
	,@@Header	XML	= NULL	OUTPUT
	,@@Body		XML	= NULL	OUTPUT
) AS BEGIN
	-- Для установки Proxy воспользуйтесь "proxycfg -u"

	DECLARE	 @OLEObject		Int
		,@HTTPStatus		Int
		,@ErrCode		Int
		,@ErrMethod		SysName
		,@ErrSource		SysName
		,@ErrDescription	SysName
		,@@SOAPAction		SysName
		,@Request		XML

	;WITH XMLNAMESPACES (
		 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
		,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
		,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
	SELECT	 @@SOAPAction	= @@Body.value('namespace-uri(/*[1])','SysName') + @@Body.value('local-name(/*[1])','SysName')
		,@Request	= (
	SELECT	 @@Header	AS [soap:Header]
		,@@Body		AS [soap:Body]
	FOR	XML Path('soap:Envelope'),Type)

	EXEC @ErrCode = sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @OLEObject OUT
	IF (@ErrCode = 0) BEGIN
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'open'		,NULL ,'POST' ,@@URL ,'false'				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'open'		GOTO Error END
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'setRequestHeader'	,NULL ,'Content-Type'	,'text/xml; charset=utf-8'	IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO Error END
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'setRequestHeader'	,NULL ,'SOAPAction'	,@@SOAPAction			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO Error END
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'send'		,NULL ,@Request						IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'send'		GOTO Error END

		EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'status' ,@HTTPStatus OUT						IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'status'		GOTO Error END
		IF (@HTTPStatus IN (200,500)) BEGIN
			DECLARE	@Response TABLE ( Response NVarChar(max) )
			INSERT	@Response
			EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'responseText'							IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'responseText'	GOTO Error END

			;WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @@Header	= R.X.query('/soap:Envelope/soap:Header/*')
				,@@Body		= R.X.query('/soap:Envelope/soap:Body/*')
			FROM	@Response CROSS APPLY (SELECT Convert(XML,Replace(Response,' encoding="utf-8"','')) AS X) R
			-- Fault
			;WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @ErrMethod	= @@SOAPAction
				,@ErrSource	= @@Body.value('(/soap:Fault/faultcode)[1]'	,'SysName')
				,@ErrDescription= @@Body.value('(/soap:Fault/faultstring)[1]'	,'SysName')
			WHERE	@HTTPStatus = 500
		END ELSE
			SELECT	 @ErrMethod	= 'send'
				,@ErrSource	= 'spSOAPMethod'
				,@ErrDescription= 'Ошибоный статус HTTP ответа "' + Convert(VarChar,@HTTPStatus) + '"'

		GOTO Destroy
	Error:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEObject ,@ErrSource OUT ,@ErrDescription OUT
	Destroy:EXEC @ErrCode = sys.sp_OADestroy @OLEObject
		IF (@ErrSource IS NOT NULL) BEGIN
			RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescription)
			IF (@@TranCount > 0 AND XACT_STATE() != 0)
				ROLLBACK
			RETURN	@@Error
		END
	END ELSE BEGIN
		RAISERROR('Ошибка при создании OLE объекта "MSXML2.ServerXMLHTTP"',18,1)
		RETURN	@@Error
	END
END
GO

Вызов делается так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE	 @URL		SysName
	,@Header	XML
	,@Body		XML
-- Создание запроса
;WITH XMLNAMESPACES (DEFAULT '<WebService URI>')
SELECT	 @URL	= '<WebService URL>'
	,@Body		= (
SELECT	 <WebMethod Param1 Value>	AS [WebMethod Param1 Name]
	,<WebMethod ParamN Value>	AS [WebMethod ParamN Name]
FOR	XML Path('<WebMethod Name>'),Type)
-- Вызов WebMethod-а
EXEC	dbo.spSOAPMethodCall
		 @URL
		,@Header	OUT	
		,@Body		OUT
-- Результат
SELECT	 @Header
	,@Body
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #35430279
YoriKim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Сейчас буду портировать на 2000 :)
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #35453158
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть одна неприятная весчть в OLE Automation: Это чтение значений более 8000 символов.
В выше приведённом случае это решается через INSERT EXEC. Но у него свои ограничеия использования (например, внутре другого INSERT EXEC).
Вот жалкие попытки обойти:
Код: sql
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.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
ALTER PROCEDURE [dbo].[spSOAPMethodCall] (
	 @@URL		SysName
	,@@Header	XML	= NULL	OUTPUT
	,@@Body		XML	= NULL	OUTPUT
	,@@TimeOut	Int	= 900000
) WITH EXECUTE AS 'dbo' AS BEGIN
	-- Для установки Proxy воспользуйтесь "proxycfg -u"
	DECLARE	 @OLEHTTP		Int
		,@OLEStream		Int
		,@HTTPStatus		Int
		,@ErrCode		Int
		,@ErrMethod		SysName
		,@ErrSource		SysName
		,@ErrDescription	SysName
		,@@SOAPAction		SysName
		,@Request		XML
		,@Response		NVarChar(max)
		,@EOF			Bit

	-- OLE HTTPRequest
	EXEC @ErrCode = sys.sp_OACreate 'MSXML2.ServerXMLHTTP' ,@OLEHTTP OUT
	IF (@ErrCode != 0)
		SELECT	 @ErrMethod	= 'MSXML2.ServerXMLHTTP'
			,@ErrSource	= 'sp_OACreate'
			,@ErrDescription= 'Ошибка создания OLE объекта'
	ELSE BEGIN
		-- Генерация SOAP запроса
		;WITH XMLNAMESPACES (
			 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
			,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
			,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
		SELECT	 @@SOAPAction	= @@Body.value('namespace-uri(/*[1])','SysName') + @@Body.value('local-name(/*[1])','SysName')
			,@Request	= (
		SELECT	 @@Header	AS [soap:Header]
			,@@Body		AS [soap:Body]
		FOR	XML Path('soap:Envelope'),Type)
		-- Установка TimeOut, HTTTP параметров, запрос
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setTimeouts'	,NULL ,5000 ,60000 , 30000, @@TimeOut				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'setTimeouts'		GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'open'		,NULL ,'POST' ,@@URL ,'false'				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'open'		GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setRequestHeader'	,NULL ,'Content-Type'	,'text/xml; charset=utf-8'	IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setRequestHeader'	,NULL ,'SOAPAction'	,@@SOAPAction			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'send'		,NULL ,@Request						IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'send'		GOTO HTTPError END
		-- Проверка сатуса HTTP ответа
		EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'status' ,@HTTPStatus OUT						IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'status'		GOTO HTTPError END
		IF (@HTTPStatus IN (200,500)) BEGIN
			-- Временый файл для постепенной закачки
			-- необходим вместо метода INSERT EXEC (> 8000 сииволов)
			-- Для отсутствия перекрытия параллельных запросов имя файл привязывается к OLE объекту по номеру
			SELECT	 @@SOAPAction	= Convert(VarChar,@OLEHTTP) + '.xml'
				,@Response	= ''
			EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'responseXml.save' ,NULL ,@@SOAPAction				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'responceXml'		GOTO HTTPError END
			-- Закачка файла в переменную через OLE Stream
			EXEC @ErrCode = sys.sp_OACreate 'ADODB.Stream' ,@OLEStream OUT
			IF (@ErrCode != 0)
				SELECT	 @ErrMethod	= 'ADODB.Stream'
					,@ErrSource	= 'sp_OACreate'
					,@ErrDescription= 'Ошибка создания OLE объекта'
			ELSE BEGIN
				-- Открытие, установка парметров, указание файла
				EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'Open'							IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Open'		GOTO StreamError END
				EXEC @ErrCode = sys.sp_OASetProperty @OLEStream ,'CharSet' ,'utf-8'					IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'CharSet'		GOTO StreamError END
				EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'LoadFromFile' ,NULL, @@SOAPAction				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'LoadFromFile'	GOTO StreamError END
				-- Для обхода "особенности" чтения utf-8
				EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'ReadText' ,@ErrDescription OUT, 2				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ReadText'		GOTO StreamError END
				-- Рекурсивное порциальное чтение
				WHILE (1 = 1) BEGIN
					-- Проверка достижения конца файла
					EXEC @ErrCode = sys.sp_OAGetProperty @OLEStream ,'EOS' ,@EOF OUT				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'EOS'			GOTO StreamError END
					IF (@EOF = 1) BREAK
					-- Чтение очережной порции
					EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'ReadText' ,@ErrDescription OUT, 128		IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'ReadText'		GOTO StreamError END
					SET @Response = @Response + @ErrDescription
				END
				-- Закрытие Stream
				EXEC @ErrCode = sys.sp_OAMethod @OLEStream ,'Close'							IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'Close'		GOTO StreamError END
				-- Уничтожение Stream
				GOTO StreamDestroy
				StreamError:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEStream ,@ErrSource OUT ,@ErrDescription OUT
				StreamDestroy:	EXEC @ErrCode = sys.sp_OADestroy @OLEStream
				-- Парсирование SOAP ответа
				IF (@ErrSource IS NULL) BEGIN
					;WITH XMLNAMESPACES (
						 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
						,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
						,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
					SELECT	 @@Header	= R.X.query('/soap:Envelope/soap:Header/*')
						,@@Body		= R.X.query('/soap:Envelope/soap:Body/*')
					FROM	(SELECT Convert(XML,Replace(@Response,' encoding="utf-8"','')) AS X) R
					-- Парсирование SOAP ошибки
					;WITH XMLNAMESPACES (
						 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
						,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
						,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
					SELECT	 @ErrMethod	= @@SOAPAction
						,@ErrSource	= @@Body.value('(/soap:Fault/faultcode)[1]'	,'SysName')
						,@ErrDescription= @@Body.value('(/soap:Fault/faultstring)[1]'	,'SysName')
					WHERE	@HTTPStatus = 500
				END
			END
		END ELSE
			SELECT	 @ErrMethod	= 'send'
				,@ErrSource	= 'spSOAPMethod'
				,@ErrDescription= 'Ошибочный статус HTTP ответа "' + Convert(VarChar,@HTTPStatus) + '"'
		-- Уничтожение HTTPRequest
		GOTO HTTPDestroy
		HTTPError:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEHTTP ,@ErrSource OUT ,@ErrDescription OUT
		HTTPDestroy:	EXEC @ErrCode = sys.sp_OADestroy @OLEHTTP
	END
	-- Вывод ошибок
	IF (@ErrSource IS NOT NULL) BEGIN
		RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescription)
		RETURN	@@Error
	END
END
GO

Жалкие, потому-что нужен доступ к файловой системе. :(
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Коннектор к веб-службам. MS SQL 2000
    #37209470
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подправим вариант для INSERT EXEC. Особенно актуально для вызова из Job-а, т.к. размер строковых данных не устанавливается максимальным, как это делается для нативного клиента.
Mnior
Код: sql
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.
CREATE PROCEDURE [dbo].[spSOAPMethodCall] (
	 @@URL		SysName
	,@@Header	XML	= NULL	OUTPUT
	,@@Body		XML	= NULL	OUTPUT
) AS BEGIN
	-- Для установки Proxy воспользуйтесь "proxycfg -u"

	DECLARE	 @OLEObject		Int
		,@HTTPStatus		Int
		,@ErrCode		Int
		,@ErrMethod		SysName
		,@ErrSource		SysName
		,@ErrDescription	SysName
		,@@SOAPAction		SysName
		,@Request		XML

	;WITH XMLNAMESPACES (
		 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
		,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
		,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
	SELECT	 @@SOAPAction	= @@Body.value('namespace-uri(/*[1])','SysName') + @@Body.value('local-name(/*[1])','SysName')
		,@Request	= (
	SELECT	 @@Header	AS [soap:Header]
		,@@Body		AS [soap:Body]
	FOR	XML Path('soap:Envelope'),Type)

	EXEC @ErrCode = sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @OLEObject OUT
	IF (@ErrCode = 0) BEGIN
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'open'		,NULL ,'POST' ,@@URL ,'false'				IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'open'		GOTO Error END
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'setRequestHeader'	,NULL ,'Content-Type'	,'text/xml; charset=utf-8'	IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO Error END
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'setRequestHeader'	,NULL ,'SOAPAction'	,@@SOAPAction			IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO Error END
		EXEC @ErrCode = sys.sp_OAMethod @OLEObject ,'send'		,NULL ,@Request						IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'send'		GOTO Error END

		EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'status' ,@HTTPStatus OUT						IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'status'		GOTO Error END
		IF (@HTTPStatus IN (200,500)) BEGIN
			DECLARE	@Response TABLE ( Response NVarChar(max) )
			SET TEXTSIZE 2147483647;
			INSERT	@Response
			EXEC @ErrCode = sys.sp_OAGetProperty @OLEObject ,'responseText'							IF (@ErrCode != 0) BEGIN SET @ErrMethod = 'responseText'	GOTO Error END

			;WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @@Header	= R.X.query('/soap:Envelope/soap:Header/*')
				,@@Body		= R.X.query('/soap:Envelope/soap:Body/*')
			FROM	@Response CROSS APPLY (SELECT Convert(XML,Replace(Response,' encoding="utf-8"','')) AS X) R
			-- Fault
			;WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @ErrMethod	= @@SOAPAction
				,@ErrSource	= @@Body.value('(/soap:Fault/faultcode)[1]'	,'SysName')
				,@ErrDescription= @@Body.value('(/soap:Fault/faultstring)[1]'	,'SysName')
			WHERE	@HTTPStatus = 500
		END ELSE
			SELECT	 @ErrMethod	= 'send'
				,@ErrSource	= 'spSOAPMethod'
				,@ErrDescription= 'Ошибоный статус HTTP ответа "' + Convert(VarChar,@HTTPStatus) + '"'

		GOTO Destroy
	Error:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEObject ,@ErrSource OUT ,@ErrDescription OUT
	Destroy:EXEC @ErrCode = sys.sp_OADestroy @OLEObject
		IF (@ErrSource IS NOT NULL) BEGIN
			RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s',18,1,@ErrMethod,@ErrSource,@ErrDescription)
			IF (@@TranCount > 0 AND XACT_STATE() != 0)
				ROLLBACK
			RETURN	@@Error
		END
	END ELSE BEGIN
		RAISERROR('Ошибка при создании OLE объекта "MSXML2.ServerXMLHTTP"',18,1)
		RETURN	@@Error
	END
END
GO

...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37221980
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лишние переменные, вызовы а главное баг , сильно влияют на производительность.
Код
Код: 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.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
ALTER PROCEDURE [dbo].[spSOAPMethodCall] (
	 @@URL		SysName
	,@@Header	XML	= NULL	OUTPUT
	,@@Body		XML	= NULL	OUTPUT
	,@@TimeOut	Int	=  900000 
	,@@OutError	Bit	=  0 
) WITH EXECUTE AS 'dbo' AS BEGIN
	-- Для установки Proxy воспользуйтесь "proxycfg -u"
	DECLARE	 @OLEHTTP	Int
		,@HTTPStatus	Int
		,@ErrCode	Int
		,@ErrMethod	SysName
		,@ErrSource	SysName
		,@ErrDescript	NVarChar( 4000 )
		,@SOAPAction	SysName
		,@Length	Int
		,@Request	XML
		,@Response	XML

	-- OLE HTTPRequest
	EXEC @ErrCode = sys.sp_OACreate 'MSXML2.ServerXMLHTTP' ,@OLEHTTP OUT
	IF (@ErrCode !=  0 )
		SELECT	 @ErrMethod	= 'MSXML2.ServerXMLHTTP'
			,@ErrSource	= 'sp_OACreate'
			,@ErrDescript	= 'Ошибка создания OLE объекта'
	ELSE BEGIN
		-- Генерация SOAP запроса
		;WITH XMLNAMESPACES (
			 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
			,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
			,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
		SELECT	 @SOAPAction	= CASE	WHEN xmlns LIKE '%/'
						THEN xmlns       + method
						ELSE xmlns + '/' + method
						END
			,@Request	= (
		SELECT	 @@Header	AS [soap:Header]
			,@@Body		AS [soap:Body]
		FOR	XML Path('soap:Envelope'),Type)
		FROM	(SELECT	 @@Body.value('namespace-uri(/*[1])','SysName')
				,@@Body.value('local-name(/*[1])'   ,'SysName')) S(xmlns,method)
		-- Установка TimeOut, HTTTP параметров, запрос
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setTimeouts'	,NULL , 5000  , 60000  ,  30000 , @@TimeOut				IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'setTimeouts'		GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'open'		,NULL ,'POST' ,@@URL ,'false'				IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'open'		GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setRequestHeader'	,NULL ,'Content-Type'	,'text/xml; charset=utf-8'	IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setRequestHeader'	,NULL ,'SOAPAction'	,@SOAPAction			IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'send'		,NULL ,@Request						IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'send'		GOTO HTTPError END
		-- Проверка сатуса HTTP ответа
		EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'status' ,@HTTPStatus OUT						IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'status'		GOTO HTTPError END
		IF (@HTTPStatus IN ( 200 , 500 )) BEGIN
			-- Длина ответа, лучше не делать так - нестабильные баги (говно код)
			EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'getResponseHeader' ,@Length OUT ,'Content-Length'			IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'getResponseHeader'	GOTO HTTPError END
			IF (@Length >  4000 ) BEGIN	-- Не умещается в переменную
				DECLARE	@TResponse TABLE (Response NVarChar(max))
				SET TEXTSIZE  2147483647 ;-- Используем глючный вариант
				INSERT @TResponse
				EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'responseText'						IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'responseText'	GOTO HTTPError END
				SELECT @Response = Convert(XML,Stuff(Response    , 1 ,IsNull(NullIf(CharIndex('?>',Response    ), 0 )+ 1 , 0 ),'')) FROM @TResponse
			END ELSE BEGIN			-- Умещается в переменную
				EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'responseText' ,@ErrDescript OUT				IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'responseText'	GOTO HTTPError END
				SELECT @Response = Convert(XML,Stuff(@ErrDescript, 1 ,IsNull(NullIf(CharIndex('?>',@ErrDescript), 0 )+ 1 , 0 ),''))
			END
			-- Парсирование SOAP ответа
			;WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @@Header	= R.Response.query('/soap:Envelope/soap:Header/node()')
				,@@Body		= R.Response.query('/soap:Envelope/soap:Body/node()')
			FROM	(SELECT @Response)R(Response)
				-- Парсирование SOAP ошибки
		IF (@HTTPStatus =  500 )
			WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @ErrMethod	= @SOAPAction
				,@ErrSource	= Coalesce(
						  B.Body.value('(/soap:Fault/faultactor)[1]'	,'SysName')
						 ,B.Body.value('(/soap:Fault/faultcode)[1]'	,'SysName')
						 ,'soap:Server')
				,@ErrDescript	= IsNull(
						  B.Body.value('(/soap:Fault/faultstring)[1]'	,'NVarChar(4000)')
						+ IsNull(
						  B.Body.value('(/soap:Fault/detail)[1]'	,'NVarChar(4000)')
						 ,''),'Unknown Error')
			FROM	(SELECT @@Body)	  B(Body)
		END ELSE
			SELECT	 @ErrMethod	= 'send'
				,@ErrSource	= 'spSOAPMethod'
				,@ErrDescript	= 'Ошибочный статус HTTP ответа "' + Convert(VarChar,@HTTPStatus) + '"'
		-- Уничтожение HTTPRequest
		GOTO HTTPDestroy
		HTTPError:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEHTTP ,@ErrSource OUT ,@ErrDescript OUT
		HTTPDestroy:	EXEC @ErrCode = sys.sp_OADestroy @OLEHTTP
	END
	-- Вывод ошибок
	IF (@ErrSource IS NOT NULL)
		IF (@@OutError =  1 ) BEGIN
			SELECT	 @@Header	= (SELECT @ErrSource	FOR XML Path(''),Type)
				,@@Body		= (SELECT @ErrDescript	FOR XML Path(''),Type)
			RETURN	 1 
		END ELSE BEGIN
			RAISERROR('Ошибка при выполнении метода "%s" в "%s": %s', 18 , 1 ,@ErrMethod,@ErrSource,@ErrDescript)
			RETURN	@@Error
		END
	ELSE	RETURN	 0 ;
END
GO
Можно ещё сэкономить на спичках.
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37302796
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнительная проверка ответа:
spSOAPMethodCall
Код: 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.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
ALTER PROCEDURE [dbo].[spSOAPMethodCall] (
	 @@URL		SysName
	,@@Header	XML	= NULL	OUTPUT
	,@@Body		XML	= NULL	OUTPUT
	,@@TimeOut	Int	=  900000 
	,@@OutError	Bit	=  0 
) WITH EXECUTE AS 'dbo' AS BEGIN
	-- Для установки Proxy воспользуйтесь "proxycfg -u"
	DECLARE	 @OLEHTTP	Int
		,@HTTPStatus	Int
		,@ErrCode	Int
		,@ErrMethod	SysName
		,@ErrSource	SysName
		,@ErrDescript	NVarChar( 4000 )
		,@SOAPAction	SysName
		,@Length	Int
		,@Request	XML
		,@Response	XML

	-- OLE HTTPRequest
	EXEC @ErrCode = sys.sp_OACreate 'MSXML2.ServerXMLHTTP' ,@OLEHTTP OUT
	IF (@ErrCode !=  0 )
		SELECT	 @ErrMethod	= 'sp_OACreate'
			,@ErrSource	= 'MSXML2.ServerXMLHTTP'
			,@ErrDescript	= 'Ошибка создания OLE объекта'
	ELSE BEGIN
		-- Генерация SOAP запроса
		;WITH XMLNAMESPACES (
			 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
			,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
			,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
		SELECT	 @SOAPAction	= CASE	WHEN xmlns LIKE '%/'
						THEN xmlns       + method
						ELSE xmlns + '/' + method
						END
			,@Request	= (
		SELECT	 @@Header	AS [soap:Header]
			,@@Body		AS [soap:Body]
		FOR	XML Path('soap:Envelope'),Type)
		FROM	(SELECT	 @@Body.value('namespace-uri(/*[1])','SysName')
				,@@Body.value('local-name(/*[1])'   ,'SysName')) S(xmlns,method)
		-- Установка TimeOut, HTTTP параметров, запрос
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setTimeouts'		,NULL , 5000  , 60000  ,  30000 , @@TimeOut			IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'setTimeouts'		GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'open'		,NULL ,'POST' ,@@URL ,'false'				IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'open'		GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setRequestHeader'	,NULL ,'Content-Type'	,'text/xml; charset=utf-8'	IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'setRequestHeader'	,NULL ,'SOAPAction'	,@SOAPAction			IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'setRequestHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'send'		,NULL ,@Request						IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'send'		GOTO HTTPError END
		-- Проверка HTTP ответа
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'getResponseHeader' ,@ErrDescript	OUT ,'Content-Type'			IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'getResponseHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAMethod @OLEHTTP ,'getResponseHeader' ,@Length		OUT ,'Content-Length'			IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'getResponseHeader'	GOTO HTTPError END
		EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'status' ,@HTTPStatus OUT						IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'status'		GOTO HTTPError END
		IF (@HTTPStatus IN ( 200 , 500 )) AND (@ErrDescript = 'text/xml; charset=utf-8') BEGIN
			IF (@Length >  4000 ) BEGIN	-- Не умещается в переменную
				DECLARE	@TResponse TABLE (Response NVarChar(max))
				SET TEXTSIZE  2147483647 ;-- Используем глючный вариант
				INSERT @TResponse
				EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'responseText'						IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'responseText'	GOTO HTTPError END
				SELECT @Response = Convert(XML,Stuff(Response    , 1 ,IsNull(NullIf(CharIndex('?>',Response    ), 0 )+ 1 , 0 ),'')) FROM @TResponse
			END ELSE BEGIN			-- Умещается в переменную
				EXEC @ErrCode = sys.sp_OAGetProperty @OLEHTTP ,'responseText' ,@ErrDescript OUT				IF (@ErrCode !=  0 ) BEGIN SET @ErrMethod = 'responseText'	GOTO HTTPError END
				SELECT @Response = Convert(XML,Stuff(@ErrDescript, 1 ,IsNull(NullIf(CharIndex('?>',@ErrDescript), 0 )+ 1 , 0 ),''))
			END
			-- Парсирование SOAP ответа
			;WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @@Header	= R.Response.query('/soap:Envelope/soap:Header/node()')
				,@@Body		= R.Response.query('/soap:Envelope/soap:Body/node()')
			FROM	(SELECT @Response)R(Response)
				-- Парсирование SOAP ошибки
		IF (@HTTPStatus =  500 )
			WITH XMLNAMESPACES (
				 'http://www.w3.org/2001/XMLSchema-instance'	AS [xsi]
				,'http://www.w3.org/2001/XMLSchema'		AS [xsd]
				,'http://schemas.xmlsoap.org/soap/envelope/'	AS [soap])
			SELECT	 @ErrMethod	= @SOAPAction
				,@ErrSource	= Coalesce(
						  B.Body.value('(/soap:Fault/faultactor)[1]'	,'SysName')
						 ,B.Body.value('(/soap:Fault/faultcode)[1]'	,'SysName')
						 ,'soap:Server')
				,@ErrDescript	= IsNull(
						  B.Body.value('(/soap:Fault/faultstring)[1]'	,'NVarChar(4000)')
						+ IsNull(
						  B.Body.value('(/soap:Fault/detail)[1]'	,'NVarChar(4000)')
						 ,''),'Unknown Error')
			FROM	(SELECT @@Body)	  B(Body)
		END ELSE
			SELECT	 @ErrMethod	= 'send'
				,@ErrSource	= 'soap:Client'
				,@ErrDescript	= 'Сервер недоступен (' + Convert(VarChar,@HTTPStatus) + ': ' + @ErrDescript + ')'
		-- Уничтожение HTTPRequest
		GOTO HTTPDestroy
		HTTPError:	EXEC @ErrCode = sys.sp_OAGetErrorInfo @OLEHTTP ,@ErrSource OUT ,@ErrDescript OUT
		HTTPDestroy:	EXEC @ErrCode = sys.sp_OADestroy @OLEHTTP
	END
	-- Вывод ошибок
	IF (@ErrSource IS NOT NULL)
		IF (@@OutError =  1 ) BEGIN
			SELECT	 @@Header	= (SELECT @ErrSource	FOR XML Path(''),Type)
				,@@Body		= (SELECT @ErrDescript	FOR XML Path(''),Type)
			RETURN	 1 
		END ELSE BEGIN
			RAISERROR('Ошибка при выполнении метода "%s" (%s): %s', 18 , 1 ,@ErrMethod,@ErrSource,@ErrDescript)
			RETURN	@@Error
		END
	ELSE	RETURN	 0 ;
END
GO
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37536622
Ворон743
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, а что делать, если веб-сервис возвращает не xml, а html с кодировкой windows-1251 (http-equiv="Content-Type" content="text/html; charset=windows-1251")? Как его обработать?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37536859
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ворон743 , там не даром стоит
Код: plaintext
ErrDescript = 'text/xml; charset=utf-8'
Вы то сами зайдите через брузер и воотчию убедитесь что WS лежит.

А SOAP протокол основан на XML. Может у нас не Web сервис, а просто HTTP запрос (POST/GET)?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37536864
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MniorА SOAP протокол основан на XML. Может у в ас не Web сервис, а просто HTTP запрос (POST/GET)?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37880400
Фотография juwdoks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас есть решения для SOAP и REST, а для XML-RPC есть какие-то примеры? Как с таким вебсервисом поработать напрямую из кода TSQL? Через clr?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37880530
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поменять десять строк, делов-то. Спеки то есть. Даже у Вики есть страничка .

Или вы не хотите включить голову и понять смысл вышеописанного кода?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37880556
Фотография juwdoks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mnior,

Как всегда, не в бровь, а в глаз :)
И на том спасибо, допилю как подсказано.
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37881715
Фотография juwdoks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу понять что не так: открываю соединение, объявляю Content-Type, отправляю запрос, но все время получаю ответ, что мой xml с параметрами неправильный.
Проверял через форму - если тот же xml запроса отправить просто post_ом, то все хорошо, а от MSSQL этот запрос доходит до скрипта без строки <?xml version="1.0" encoding="UTF-8"?> - на что и ругается вебсервис (похоже).
Проблема в XML declaration - как заставить MSSQL не убирать его из запроса, даже если version="1.0"?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37881900
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juwdoks , согласен, тотальное большинство не знают что такое XML декларация и для чего она.
Кстати, тот сервер, который вы используете писали и...ты. Кодировка текстового потока задаётся в заголовках. Этого достаточно.
Когда же уже вытестится эта "проблема".

juwdoks , в XML нет никаких заголовков, они есть в средствах хранения и передачи данных.
Если их серевер настолько туп, то передавайте строку с дополненной шапкой, а не XML структуру.
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #37881907
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MniorКогда же уже вытеснится эта "проблема" сдравым кодом.Хотя чё я, там же допотопный XML-RPC. Другого и ждать нечего.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Коннектор к веб-службам. MS SQL 2000
    #38794559
Фотография juwdoks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под 2012 даёт ошибку:
Ошибка при выполнении метода "send" (msxml3.dll): Параметр задан неверно.

Причём формат методов объекта MSXML2.ServerXMLHTTP вроде не менялся ((
Кто-то сталкивался? В инете нарыл пару аналогичных жалоб, но решения нет, чтоб его.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Коннектор к веб-службам. MS SQL 2000
    #39556913
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juwdoks,

та же беда. Мне нужно то же на 2014 сервере. Кто вообще этим пользуется? или может что новое есть для решение таких задач в 2014 скуле?
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #39556930
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

нормальные люди пишут трехслойку в таких случаях, а прочие - CLR процедуры.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Коннектор к веб-службам. MS SQL 2000
    #40059798
newbie876454
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

что за трехслойка?
Подскажите, как по уму сделать веб сервисы к SQL Server.
Нужна отправка в обе стороны.
А то нарыл такую фразу:
"Перепиши на .Net этот код, сделай Dll и подключи к MS SQL через "CREATE ACCEMBLY". Когда у тебя база задедосит WEB сервер, перепишеш на использование SERVICE BROKER; а когда CLR сожрёт всю оперативу перенесёшь на отдельный сервак.
А ПРО MSXML2.XMLHTTP и sp_OACreate ЗАБУДЬ!"

И захотел сделать правильно.
Только не для SQL Server 2000, а для более актуальной версии: SQL Server 2017.
...
Рейтинг: 0 / 0
Коннектор к веб-службам. MS SQL 2000
    #40059919
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454,

имеется в виду трехуровневая архитектура model-view-controller.
https://ru.wikipedia.org/wiki/Model-View-Controller.

При такой архитектуре контроллер выполняет роль диспетчера данных, view - веб-интерфейс (SOAP, REST и тому подобные) или приложение Windows, модель - база данных, обеспечивающая целостность декларативную и процедурную и доступность (резервные копии, репликация и так далее).

В случае необходимости "вызвать веб-службу" этим занимается контроллер, который может выполнить функцию как автоматически, так и по запросу пользователя.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Коннектор к веб-службам. MS SQL 2000
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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