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 是存储过程或用户定义函数的名称,或者是即席批处理查询的 sqlbatch。sqlbatch 是用来运行即席查询的方法。
在 <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>