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 transmet des paramètres au client appelant.
Dans une procédure stockée Transact-SQL, toute SELECT
instruction qui retourne zéro ligne ou plus 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 les résultats au canal connecté à l’aide Send
des méthodes de l’objetSqlPipe
. Accédez à la propriété Pipe
de l'objet SqlContext
pour obtenir l'objet SqlPipe
. La classe SqlPipe
est similaire sur le plan conceptuel à la classe Response
présente dans ASP.NET. Pour plus d'informations, consultez la documentation de référence sur la classe SqlPipe dans le kit de développement logiciel (SDK) du .NET Framework.
Retour de résultats sous forme de tableau et de messages
La classe SqlPipe
possède une méthode Send
avec trois surcharges. Il s'agit des éléments suivants :
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
La méthode Send
envoie des données directement au client ou à l'appelant. C'est généralement le client qui utilise la sortie de la méthode SqlPipe
, mais dans le cas de 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 managée. Si Procedure2 appelle maintenant SqlPipe.Send( SqlDataRecord), la ligne est envoyée au lecteur de Procedure1, pas au client.
La Send
méthode envoie un message de chaîne qui s’affiche sur le client sous la forme d’un message d’information, équivalent à PRINT dans Transact-SQL. Elle peut également envoyer un jeu de résultats à ligne unique à l'aide de SqlDataRecord
ou un jeu de résultats à plusieurs ligne à l'aide d'un SqlDataReader
.
L'objet SqlPipe
possède é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 les résultats directement à l'appelant. Si la commande qui a été envoyée contient des erreurs, des exceptions sont envoyées au canal, mais une copie est également envoyée au code managé appelant. Si le code appelant n’intercepte pas l’exception, il propage la pile vers le code Transact-SQL et s’affiche deux fois dans la sortie. Si le code appelant intercepte l'exception, le consommateur du canal continue à voir l'erreur, mais il n'y a pas d'erreur de duplication.
Elle peut uniquement accepter un SqlCommand
associé à la connexion contextuelle ; elle ne peut pas accepter de commande associée à la connexion non contextuelle.
Retour de jeux de résultats personnalisés
Les procédures stockées managées peuvent envoyer des jeux de résultats qui ne proviennent pas d'un SqlDataReader
. La méthode SendResultsStart
, ainsi que SendResultsRow
et SendResultsEnd
, permettent aux procédures stockées d'envoyer des jeux de résultats personnalisés au client.
SendResultsStart
accepte un SqlDataRecord
en tant qu'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. Elle 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 des métadonnées.
Notes
Après l'appel de la méthode SendResultsStart
, seules SendResultsRow
et SendResultsEnd
peuvent être appelées. L'appel de toute autre méthode dans la même instance de SqlPipe
entraîne InvalidOperationException
. SendResultsEnd
rétablit SqlPipe
à son état initial, dans lequel d'autres méthodes peuvent être appelées.
Exemple
La procédure stockée uspGetProductLine
retourne les nom, numéro de produit, couleur et tarif de tous les produits dans une ligne de produit spécifiée. Cette procédure stockée accepte des 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 uspGetProduct
procédure, qui retourne une liste de produits de vélo de tourisme.
EXEC uspGetProductLineVB 'T';
Voir aussi
Objet SqlDataRecord
Procédures stockées du CLR
Extensions spécifiques in-process de SQL Server à ADO.NET