SOAP 响应消息结构

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

本主题介绍 SOAP 响应消息结构,用它可以分析 SOAP 响应,而不用使用 Visual Studio 2005 提供的代理类。

SQL Server 的实例返回的 SOAP 响应消息可能包含下列一项或多项:

  • SELECT 查询的结果集。

  • 存储过程和用户定义函数的返回代码。

  • 行计数。这是受查询影响的行数。

  • 输出参数值。

  • 错误消息或警告。

下面是运行存储过程后 SQL Server 返回的 SOAP 响应结构的片段:

<?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>

操作的结果包装在 SOAP 主体的 <MethodNameResponse> 元素中。<MethodNameResponse> 元素可能包含下列子元素:

  • <MethodNameResult> 包含结果、行计数值以及错误消息和警告。

  • <OutputParameter> 包含存储过程返回的输出参数(如果有)。

<MethodNameResult> 元素

操作的结果在 <MethodNameResult> 元素中返回,其中 MethodName 是存储过程或用户定义函数的名称,或者是即席批处理查询的 sqlbatchsqlbatch 是用来运行即席查询的方法。

在 <MethodNameResult> 元素中,结果按如下所示进行序列化:

  • SELECT 语句的结果包装在 <SqlRowSet> 元素中。在 <SqlRowSet> 元素中序列化的结果使用 DiffGram 序列化格式。DiffGram 格式是在 Microsoft .NET Framework 的 DataSet 组件中引入的。在这种情况下,响应还在数据前包含一个 XSD 架构(如果创建端点时已启用架构)。在 Visual Studio 2005 客户端,结果作为 System.Data.DataSet 对象返回。

    注意注意

    若要在使用 Visual Studio 2005 时将 SOAP 结果加载到 System.Data.DataSet 对象中,SQL 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 查询通过指定 XMLSCHEMA 选项来请求 XSD 架构,XSD 架构将作为 <SqlXml> 元素的第一个子元素返回。

    在 Visual Studio 2005 客户端,结果作为 System.Xml.XmlElement 对象返回。

  • 存储过程和用户定义函数的返回代码值包装在 <SqlResultCode> 元素中,如以下响应片段所示:

    <tns:MethodNameResponse>

      <tns:MethodNameResult 
    xsi:type="sqlsoaptypes:SqlResultStream">
      <!-- 
        results 
      -->
         <sqlresultstream:SqlResultCode
    xsi: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 Web 服务请求的示例应用程序。存储过程中的第一个 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> 元素

每个输出参数值在返回时都包装在一个元素中。元素名称就是输出参数的名称。请注意,此元素作为 <MethodNameResponse> 元素的最后一个子元素显示在 <MethodNameResult> 元素之后,如以下 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>