Objet SqlPipe
S'applique à :SQL Server
Dans les versions précédentes de SQL Server, il était courant d’écrire une procédure stockée (ou une procédure stockée étendue) qui a envoyé 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 Microsoft.SqlServer.Server.SqlPipe.
Retourner les résultats tabulaires et les messages
L’objet SqlPipe
a une méthode Send
, qui a trois surcharges. Il s'agit de :
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 du SqlPipe
, mais avec 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 la 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 dans Procedure1
, et non au client.
La méthode Send
envoie un message de chaîne qui apparaît 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 et une copie est envoyée à l’appel du code managé. Si le code appelant n’intercepte pas l’exception, il propage la pile vers le 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
associé à la connexion de contexte ; il ne peut pas prendre de commande associée à la connexion non contextuelle.
Retourner des 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.
Après avoir appelé la méthode SendResultsStart
, seuls SendResultsRow
et SendResultsEnd
peuvent être appelés. 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 des correspondances exactes pour prodLine
.
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.
}
}
}
};
L’instruction Transact-SQL suivante exécute la procédure uspGetProduct
, qui retourne une liste de produits de vélo de tournée.
EXECUTE uspGetProductLineVB 'T';