Структура сообщения-ответа SOAP
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.
Этот подраздел описывает структуру сообщений-ответов SOAP, если необходимо проанализировать ответ SOAP вместо использования классов учетной записи-посредника, предоставленных средой Visual Studio 2005.
Сообщение-ответ SOAP, возвращенное экземпляром SQL Server, может включать одно или более из следующего:
Результирующий набор запросов SELECT.
Код возврата хранимых процедур и пользовательских функций.
Число строк таблицы. Это число строк таблицы, затронутых запросом.
Значения параметров выходных данных.
Сообщения об ошибках или предупреждениях.
Ниже приведен фрагмент структуры ответов SOAP, возвращаемой SQL Server после выполнения хранимой процедуры:
<?xml version="1.0" encoding="utf-8" ?> <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" ...> <SOAP-ENV:Body> <method:MethodNameResponse> <method:MethodNameResult xsi:type="sqlresultstream:SqlResultStream"><!-- the results are returned here--> </method:MethodNameResult> <method:OutputParam>Value</method:OutputParam> </method:MethodNameResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Результаты операции упакованы в элемент <MethodNameResponse> в теле SOAP. Элемент <MethodNameResponse> может включать следующие дочерние элементы:
Элемент <MethodNameResult> включает результаты, значения подсчета строк таблицы, сообщения об ошибках и предупреждения.
Элемент <OutputParameter> включает параметры выходных данных (при их наличии), возвращенных хранимыми процедурами.
Элемент <MethodNameResult>
Результаты операции возвращаются внутри элемента <MethodNameРезультат>, где MethodName является либо названием хранимой процедуры или пользовательской функции, либо методом sqlbatch для нерегламентированных пакетных запросов. sqlbatch — метод, используемый для выполнения нерегламентированных запросов.
Внутри элемента <MethodNameРезультат> результаты сериализуются следующим образом:
Результаты инструкции SELECT упаковываются в элемент <SqlRowSet>. Результаты, упорядоченные в элементе <SqlRowSet>, используют формат сериализации DiffGram. Формат DiffGram вводится в компонент DataSet в среде Microsoft.NET Framework. В этом случае ответ также включает XSD-схему (если схема включена для созданной конечной точки) перед данными. В клиенте Visual Studio 2005 результаты возвращаются как объекты System.Data.DataSet.
Примечание Для загрузки результатов SOAP в объекты System.Data.DataSet при использовании клиента Visual Studio 2005SQL Server должен включать встроенные схемы в ответы SOAP, возвращаемые клиентам. Такое поведение включается для конечных точек либо исключением ключевого слова SCHEMA, либо указанием SCHEMA=STANDARD при создании конечной точки. Дополнительные сведения см. в разделе CREATE ENDPOINT (Transact-SQL).
Результат инструкции SELECT... FOR XML упаковывается в элемент <SqlXml>. Если возвращается несколько результирующих наборов (например, хранимая процедура с несколькими запросами SELECT...FOR XML), каждый результирующий набор упаковывается в свой элемент <SqlXml>. Кроме того, за каждым результатом следует элемент <SqlRowCount>. Элемент возвращает число строк таблицы, затронутых запросом, как показано в следующем фрагменте ответа:
<tns:MethodNameResponse> <tns:MethodNameResult xsi:type="sqlsoaptypes:SqlResultStream"> <sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXml" > <SqlXml> <!-- XML result --> </SqlXml></sqlresultstream:SqlXml><sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount"> <sqlrowcount:Count>NoOfRowsAffected</sqlrowcount:Count> </sqlresultstream:SqlRowCount><sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXml" > <SqlXml> <!-- XML Document that maps to XMLElement object in the client--> </SqlXml></sqlresultstream:SqlXml><sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount"> <sqlrowcount:Count>NoOfRowsAffected</sqlrowcount:Count> </sqlresultstream:SqlRowCount> <!-- more results ...--> </tns:MethodNameResult> <tns:OutputParam>Value</tns:OutputParam> </tns:MethodNameResponse>
Если запрос SELECT... FOR XML запрашивает XSD-схему, указывая параметр XMLSCHEMA, XSD-схема возвращается, как первый дочерний элемент элемента <SqlXml>.
В клиенте Visual Studio 2005 результаты возвращаются как объекты System.Xml.XmlElement.
Значения кода возврата из хранимых процедур и пользовательских функций упаковываются в элемент <SqlResultCode>, как показано в следующем фрагменте ответа:
<tns:MethodNameResponse>
<tns:MethodNameResult xsi:type="sqlsoaptypes:SqlResultStream"> <!-- results --> <sqlresultstream:SqlResultCodexsi:type="sqlsoaptypes:SqlResultCode"> ReturnCodeValue </sqlresultstream:SqlResultCode> </tns:MethodNameResult> <tns:OutputParam>Value</tns:OutputParam> </tns:MethodNameResponse>
В клиенте Visual Studio 2005 код возврата возвращается как объект.
Сообщения об ошибках, предупреждения и другие информационные сообщения SQL Server упаковываются в элемент <SqlMessage>, как показано в следующем фрагменте ответа SOAP:
<tns:MethodNameResponse> <tns:MethodNameResult xsi:type="sqlresultstream:SqlResultStream"> <sqlresultstream:SqlMessage> <!-- Error message returned as SqlMessage object in the client --> </sqlresultstream:SqlMessage> ... </tns:MethodNameResult> <!-- followed by one or more return parameters -> ...</tns:MethodNameResponse>
Следующий фрагмент ответа SOAP возвращается запуском хранимой процедуры GetCustomerInfo. Дополнительные сведения об этой хранимой процедуре см. в разделе Образцы приложений, отправляющих запросы к собственным веб-службам с поддержкой XML. Первая инструкция INSERT в хранимой процедуре завершается неуспешно. Это приводит к следующему ответу:
<method:GetCustomerInfoResponse> <method:GetCustomerInfoResult xsi:type="sqlresultstream:SqlResultStream"> <sqlresultstream:SqlMessage> <sqlresultstream:SqlMessage xsi:type="sqlmessage:SqlMessage"><sqlmessage:Class>16</sqlmessage:Class> <sqlmessage:LineNumber>12</sqlmessage:LineNumber> <sqlmessage:Message>Cannot insert the value NULL into column 'CompanyName', table 'Northwind.dbo.Customers'; column does not allow nulls. INSERT fails. </sqlmessage:Message> <sqlmessage:Number>515</sqlmessage:Number> <sqlmessage:Procedure>GetCustomerInfo</sqlmessage:Procedure> <sqlmessage:Server>SQLServerName</sqlmessage:Server> <sqlmessage:Source>MicrosofTransact-SQL/9.0</sqlmessage:Source> <sqlmessage:State>2</sqlmessage:State> </sqlresultstream:SqlMessage> <sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount"> <sqlrowcount:Count>0</sqlrowcount:Count> </sqlresultstream:SqlRowCount> <sqlresultstream:SqlResultCode xsi:type="sqlsoaptypes:SqlResultCode">-6 </sqlresultstream:SqlResultCode> </method:GetCustomerInfoResult> <!-- followed by one or more output parameters -> </method:GetCustomerInfoResponse></tns:MethodNameResponse>
В клиенте Visual Studio 2005 эти результаты возвращаются как объекты типа SqlMessage.
Элемент <OutputParameter>
Каждое значение параметра выходных данных возвращается упакованным в элемент. Название элемента является названием параметра выходных данных. Обратите внимание, что этот элемент появляется после элемента <MethodNameРезультат> как последний дочерний элемент элемента <MethodNameResponse>; это показано в следующем фрагменте ответа SOAP. Возвращаются два параметра выходных данных.
<tns:MethodNameResponse> <tns:MethodNameResult xsi:type="sqlresultstream:SqlResultStream"> <!-- results, error messages and warnings --> </tns:MethodNameResult> <tns:OutputParam1>Value</tns:OutputParam1> <tns:OutputParam2>Value</tns:OutputParam2> </tns:MethodNameResponse>
См. также