Поделиться через


Структура сообщения-ответа 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> включает параметры выходных данных (при их наличии), возвращенных хранимыми процедурами.

Элемент &lt;MethodNameResult&gt;

Результаты операции возвращаются внутри элемента <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.

Элемент &lt;OutputParameter&gt;

Каждое значение параметра выходных данных возвращается упакованным в элемент. Название элемента является названием параметра выходных данных. Обратите внимание, что этот элемент появляется после элемента <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>