Condividi tramite


Struttura del messaggio di risposta SOAP

Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

In questo argomento viene descritta la struttura del messaggio di risposta SOAP, utile se si desidera analizzare la risposta SOAP invece di utilizzare le classi proxy fornite da Visual Studio 2005.

Un messaggio di risposta SOAP restituito da un'istanza di SQL Server può includere uno o più dei seguenti:

  • Set di risultati per query SELECT.

  • Codice restituito per stored procedure e funzioni definite dall'utente.

  • Conteggio delle righe. Si tratta del numero di righe interessate dalla query.

  • Valori del parametro di output.

  • Messaggi di errore o avvisi.

Di seguito è riportato un frammento della struttura della risposta SOAP restituita da SQL Server dopo l'esecuzione di una stored procedure:

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

I risultati di un'operazione sono inseriti nell'elemento <MethodNameResponse> del corpo SOAP. L'elemento <MethodNameResponse> può contenere gli elementi figlio seguenti:

  • <MethodNameResult> include i risultati, i valori di conteggio righe, i messaggi di errore e gli avvisi.

  • <OutputParameter> include gli eventuali parametri di output restituiti dalle stored procedure.

Elemento &lt;MethodNameResult&gt;

I risultati di un'operazione vengono restituiti all'interno dell'elemento <MethodNameResult>, in cui MethodName è il nome di una stored procedure o funzione definita dall'utente, oppure è sqlbatch per le query batch ad hoc. sqlbatch è il metodo utilizzato per l'esecuzione delle query ad hoc.

Nell'ambito dell'elemento <MethodNameResult> i risultati vengono serializzati come segue:

  • Il risultato di un'istruzione SELECT viene inserito in un elemento <SqlRowSet>. I risultati serializzati nell'elemento <SqlRowSet> utilizzano il formato di serializzazione DiffGram. DiffGram è un nuovo formato utilizzato per la prima volta nel componente DataSet di Microsoft.NET Framework. In questo caso, la risposta include anche uno schema XSD prima dei dati (se l'endpoint viene creato con lo schema abilitato). Nel client di Visual Studio 2005, i risultati vengono restituiti come oggetti System.Data.DataSet.

    [!NOTA]

    Per caricare i risultati SOAP negli oggetti System.Data.DataSet quando si utilizzaVisual Studio 2005, SQL Server deve includere schemi inline nelle risposte SOAP che restituisce ai client. È possibile attivare questa funzione per gli endpoint omettendo la parola chiave SCHEMA oppure specificando SCHEMA=STANDARD alla creazione dell'endpoint. Per ulteriori informazioni, vedere CREATE ENDPOINT (Transact-SQL).

  • Il risultato di un'istruzione SELECT... FOR XML viene inserito in un elemento <SqlXml>. In caso di restituzione di più set di risultati, ad esempio una stored procedure con più query SELECT...FOR XML, ogni set di risultati viene inserito in uno specifico elemento <SqlXml>. Ogni risultato è inoltre seguito da un elemento <SqlRowCount>. Questo elemento restituisce il numero di righe interessate dalla query, come illustrato nel frammento di risposta seguente:

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

    Se la query SELECT... FOR XML richiede uno schema XSD specificando l'opzione XMLSCHEMA, lo schema XSD viene restituito come primo elemento figlio dell'elemento <SqlXml>.

    Nel client di Visual Studio 2005, i risultati vengono restituiti come oggetti System.Xml.XmlElement.

  • I valori dei codici restituiti dalle stored procedure e dalle funzioni definite dall'utente vengono inseriti in un elemento <SqlResultCode>, come illustrato nel frammento di risposta seguente:

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

    Nel client di Visual Studio 2005 il codice viene restituito come un oggetto.

  • I messaggi di errore, gli avvisi e gli altri messaggi informativi di SQL Server vengono inseriti in un elemento <SqlMessage>, come illustrato nel frammento di risposta SOAP seguente:

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

    Il frammento di risposta SOAP seguente viene restituito eseguendo la stored procedure GetCustomerInfo. Per informazioni su questa stored procedure, vedere Applicazioni di esempio per l'invio di richieste ai servizi Web XML nativi. La prima istruzione INSERT della stored procedure non viene eseguita correttamente. La risposta generata è la seguente.

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

    Nel client di Visual Studio 2005 questi risultati vengono restituiti come oggetti di tipo SqlMessage.

Elemento &lt;OutputParameter&gt;

I valori di tutti i parametri di output vengono restituiti inseriti in un elemento. Il nome dell'elemento è il nome del parametro di output. Si noti che l'elemento compare dopo l'elemento <MethodNameResult> come ultimo figlio dell'elemento <MethodNameResponse>, come illustrato nel frammento di risposta SOAP seguente. Vengono restituiti due parametri di output.

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