Partager via


Objet SqlPipe

Dans les versions précédentes de SQL Server, il est très courant d’écrire une procédure stockée (ou une procédure stockée étendue) qui envoie des résultats ou des paramètres de sortie au client appelant.

Dans une procédure stockée Transact-SQL, toute instruction SELECT qui retourne zéro ou plusieurs lignes envoie les résultats au « canal » de l’appelant connecté.

Pour les objets de base de données CLR (Common Language Runtime) s’exécutant dans SQL Server, vous pouvez envoyer des résultats au canal connecté à l’aide des méthodes Send de l’objet SqlPipe. Accédez à la propriété Pipe de l’objet SqlContext pour obtenir l’objet SqlPipe. La classe SqlPipe est conceptuellement similaire à la classe Response trouvée dans ASP.NET. Pour plus d’informations, consultez la documentation de référence de la classe SqlPipe dans le kit de développement logiciel .NET Framework.

Retour des résultats tabulaires et des messages

Il SqlPipe a une Send méthode, qui a trois surcharges. Elles sont les suivantes :

  • void Send(string message)

  • void Send(SqlDataReader reader)

  • void Send(SqlDataRecord record)

La méthode Send envoie directement des données au client ou à l’appelant. Il s’agit généralement du client qui consomme la sortie à partir du SqlPipe, mais dans le cas des procédures stockées CLR imbriquées, le consommateur de sortie peut également être une procédure stockée. Par exemple, Procedure1 appelle SqlCommand.ExecuteReader() avec le texte de commande « EXEC Procedure2 ». Procedure2 est également une procédure stockée gérée. Si Procedure2 appelle maintenant SqlPipe.Send( SqlDataRecord), la ligne est envoyée au lecteur de Procedure1, et non au client.

La Send méthode envoie un message de chaîne qui s’affiche sur le client en tant que message d’informations, équivalent à PRINT dans Transact-SQL. Il peut également envoyer un jeu de résultats à une seule ligne à l’aide de SqlDataRecord, ou d’un jeu de résultats à plusieurs lignes à l’aide d’un SqlDataReader.

L’objet SqlPipe a également une méthode ExecuteAndSend. Cette méthode peut être utilisée pour exécuter une commande (passée en tant qu’objet SqlCommand) et renvoyer directement les résultats à l’appelant. S’il existe des erreurs dans la commande envoyée, les exceptions sont envoyées au canal, mais une copie est également envoyée à l’appel du code managé. Si le code appelant n’intercepte pas l’exception, il propage la pile au code Transact-SQL et apparaît deux fois dans la sortie. Si le code appelant intercepte l’exception, le consommateur de canal voit toujours l’erreur, mais il n’y a pas d’erreur en double.

Il ne peut prendre qu’un SqlCommand élément associé à la connexion de contexte ; il ne peut pas prendre de commande associée à la connexion non contextuelle.

Retour de jeux de résultats personnalisés

Les procédures stockées gérées peuvent envoyer des jeux de résultats qui ne proviennent pas d’un SqlDataReader. La méthode SendResultsStart, ainsi que SendResultsRow et SendResultsEnd, permet aux procédures stockées d’envoyer des jeux de résultats personnalisés au client.

SendResultsStart prend un SqlDataRecord comme entrée. Elle marque le début d'un jeu de résultats et utilise les métadonnées d'enregistrement pour construire les métadonnées qui décrivent le jeu de résultats. Il n’envoie pas la valeur de l’enregistrement avec SendResultsStart. Toutes les lignes suivantes, envoyées à l’aide de SendResultsRow, doivent correspondre à cette définition de métadonnées.

Remarque

Après avoir appelé la SendResultsStart méthode uniquement SendResultsRow et SendResultsEnd peut être appelée. L’appel d’une autre méthode dans la même instance de SqlPipe provoque une InvalidOperationException. SendResultsEnd définit SqlPipe à l’état initial dans lequel d’autres méthodes peuvent être appelées.

Exemple :

La procédure stockée uspGetProductLine retourne le nom, le numéro de produit, la couleur et le prix de liste de tous les produits au sein d’une gamme de produits spécifiée. Cette procédure stockée accepte les correspondances exactes pour prodLine.

C#

using System;  
using System.Data;  
using System.Data.SqlClient;  
using System.Data.SqlTypes;  
using Microsoft.SqlServer.Server;  
  
public partial class StoredProcedures  
{  
[Microsoft.SqlServer.Server.SqlProcedure]  
public static void uspGetProductLine(SqlString prodLine)  
{  
    // Connect through the context connection.  
    using (SqlConnection connection = new SqlConnection("context connection=true"))  
    {  
        connection.Open();  
  
        SqlCommand command = new SqlCommand(  
            "SELECT Name, ProductNumber, Color, ListPrice " +  
            "FROM Production.Product " +   
            "WHERE ProductLine = @prodLine;", connection);  
  
        command.Parameters.AddWithValue("@prodLine", prodLine);  
  
        try  
        {  
            // Execute the command and send the results to the caller.  
            SqlContext.Pipe.ExecuteAndSend(command);  
        }  
        catch (System.Data.SqlClient.SqlException ex)  
        {  
            // An error occurred executing the SQL command.  
        }  
     }  
}  
};  

Visual Basic

Imports System  
Imports System.Data  
Imports System.Data.SqlClient  
Imports System.Data.SqlTypes  
Imports Microsoft.SqlServer.Server  
  
Partial Public Class StoredProcedures  
<Microsoft.SqlServer.Server.SqlProcedure()> _  
Public Shared Sub uspGetProductLine(ByVal prodLine As SqlString)  
    Dim command As SqlCommand  
  
    ' Connect through the context connection.  
    Using connection As New SqlConnection("context connection=true")  
        connection.Open()  
  
        command = New SqlCommand( _  
        "SELECT Name, ProductNumber, Color, ListPrice " & _  
        "FROM Production.Product " & _  
        "WHERE ProductLine = @prodLine;", connection)  
        command.Parameters.AddWithValue("@prodLine", prodLine)  
  
        Try  
            ' Execute the command and send the results   
            ' directly to the caller.  
            SqlContext.Pipe.ExecuteAndSend(command)  
        Catch ex As System.Data.SqlClient.SqlException  
            ' An error occurred executing the SQL command.  
        End Try  
    End Using  
End Sub  
End Class  

L’instruction Transact-SQL suivante exécute la procédure uspGetProduct, qui retourne une liste de produits de vélo de tournée.

EXEC uspGetProductLineVB 'T';  

Voir aussi

SqlDataRecord, objet
Procédures stockées CLR
SQL Server In-Process extensions spécifiques à ADO.NET