SqlPipe-object
van toepassing op:SQL Server-
In eerdere versies van SQL Server was het gebruikelijk om een opgeslagen procedure (of een uitgebreide opgeslagen procedure) te schrijven die resultaten of uitvoerparameters naar de aanroepende client heeft verzonden.
In een Transact-SQL opgeslagen procedure verzendt elke SELECT
instructie die nul of meer rijen retourneert de resultaten naar de 'pipe' van de verbonden beller.
Voor CLR-databaseobjecten (Common Language Runtime) die worden uitgevoerd in SQL Server, kunt u resultaten verzenden naar de verbonden pijp met behulp van de Send
methoden van het SqlPipe
-object. Open de eigenschap Pipe
van het SqlContext
-object om het SqlPipe
-object te verkrijgen. De SqlPipe
klasse is conceptueel vergelijkbaar met de Response
klasse in ASP.NET.
Zie Microsoft.SqlServer.Server.SqlPipevoor meer informatie.
Resultaten en berichten in tabelvorm retourneren
Het SqlPipe
-object heeft een Send
methode, die drie overbelastingen heeft. Dit zijn:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
De methode Send
verzendt gegevens rechtstreeks naar de client of aanroeper. Dit is meestal de client die de uitvoer van de SqlPipe
verbruikt, maar met geneste CLR-opgeslagen procedures kan de uitvoerconsumer ook een opgeslagen procedure zijn.
Procedure1
roept bijvoorbeeld SqlCommand.ExecuteReader()
aan met de opdrachttekst EXEC Procedure2
.
Procedure2
is ook een beheerde opgeslagen procedure. Als Procedure2
nu SqlPipe.Send(SqlDataRecord)
aanroept, wordt de rij in Procedure1
naar de lezer verzonden, niet naar de client.
De methode Send
verzendt een tekenreeksbericht dat op de client wordt weergegeven als een informatiebericht, vergelijkbaar met PRINT
in Transact-SQL. Het kan ook een resultatenset met één rij verzenden met behulp van SqlDataRecord
of een resultatenset met meerdere rijen met behulp van een SqlDataReader
.
Het SqlPipe
-object heeft ook een ExecuteAndSend
methode. Deze methode kan worden gebruikt om een opdracht uit te voeren (doorgegeven als een SqlCommand
-object) en resultaten rechtstreeks terug te sturen naar de aanroeper. Als er fouten zijn opgetreden in de opdracht die is verzonden, worden uitzonderingen naar de pijp verzonden en wordt er een kopie verzonden naar het aanroepen van beheerde code. Als de aanroepende code de uitzondering niet ondervangt, wordt de stack doorgegeven aan de Transact-SQL code en wordt deze twee keer weergegeven in de uitvoer. Als de aanroepende code de uitzondering ondervangt, ziet de pipe-consument nog steeds de fout, maar er is geen dubbele fout.
Er kan alleen een SqlCommand
worden gebruikt die is gekoppeld aan de contextverbinding; er kan geen opdracht worden uitgevoerd die is gekoppeld aan de niet-contextverbinding.
Aangepaste resultatensets retourneren
Beheerde opgeslagen procedures kunnen resultatensets verzenden die niet afkomstig zijn van een SqlDataReader
. Met de methode SendResultsStart
, samen met SendResultsRow
en SendResultsEnd
, kunnen opgeslagen procedures aangepaste resultatensets naar de client verzenden.
SendResultsStart
neemt een SqlDataRecord
als invoer. Het markeert het begin van een resultatenset en gebruikt de metagegevens van de record om de metagegevens te maken die de resultatenset beschrijven. De waarde van de record wordt niet met SendResultsStart
verzonden. Alle volgende rijen, die worden verzonden met SendResultsRow
, moeten overeenkomen met die metagegevensdefinitie.
Nadat u de methode SendResultsStart
hebt aangeroepen, kunnen alleen SendResultsRow
en SendResultsEnd
worden aangeroepen. Het aanroepen van een andere methode in hetzelfde exemplaar van SqlPipe
veroorzaakt een InvalidOperationException
.
SendResultsEnd
stelt SqlPipe
weer in op de beginstatus waarin andere methoden kunnen worden aangeroepen.
Voorbeeld
De uspGetProductLine
opgeslagen procedure retourneert de naam, het productnummer, de kleur en de catalogusprijs van alle producten binnen een opgegeven productlijn. Deze opgeslagen procedure accepteert exacte overeenkomsten voor 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.
}
}
}
};
De volgende Transact-SQL instructie voert de uspGetProduct
procedure uit, waarmee een lijst met toerfietsproducten wordt geretourneerd.
EXECUTE uspGetProductLineVB 'T';