Share via


SOAP 応答メッセージの構造

この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。

このトピックでは、Visual Studio 2005 で提供されるプロキシ クラスを使用しないで SOAP 応答を解析する場合の、SOAP 応答メッセージの構造について説明します。

SQL Server のインスタンスから返される SOAP 応答メッセージには、次のうちの 1 つ以上の情報が含まれます。

  • 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> には、ストアド プロシージャによって返される出力パラメータがあれば、その出力パラメータが含まれます。

&lt;MethodNameResult&gt; 要素

操作の結果は、<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 エラー メッセージ、警告、およびその他の情報メッセージは、次の SOAP 応答の例に示すように <SqlMessage> 要素にラップされます。

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

    GetCustomerInfo ストアド プロシージャを実行することによって、次の例に示すような SOAP 応答が返されます。このストアド プロシージャの詳細については、「ネイティブ 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 型のオブジェクトとして返されます。

&lt;OutputParameter&gt; 要素

各出力パラメータ値は、1 つの要素にラップされて返されます。要素名は、出力パラメータの名前になります。この要素は、<MethodNameResponse> 要素の最後の子要素として、<MethodNameResult> 要素の後に示されます。これを、次の SOAP 応答の例に示します。この例では 2 つの出力パラメータが返されます。

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