SqlPipe-objekt
gäller för:SQL Server
I tidigare versioner av SQL Server var det vanligt att skriva en lagrad procedur (eller en utökad lagrad procedur) som skickade resultat- eller utdataparametrar till den anropande klienten.
I en Transact-SQL lagrad procedur skickar alla SELECT
-instruktioner som returnerar noll eller fler rader resultatet till den anslutna anroparens "pipe".
För CLR-databasobjekt (Common Language Runtime) som körs i SQL Server kan du skicka resultat till det anslutna röret med hjälp av Send
metoder för SqlPipe
-objektet. Få åtkomst till egenskapen Pipe
för SqlContext
-objektet för att hämta objektet SqlPipe
. Klassen SqlPipe
liknar den Response
klass som finns i ASP.NET.
Mer information finns i Microsoft.SqlServer.Server.SqlPipe.
Returnera tabellresultat och meddelanden
Objektet SqlPipe
har en Send
-metod som har tre överlagringar. De är:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
Metoden Send
skickar data direkt till klienten eller anroparen. Det är vanligtvis klienten som förbrukar utdata från SqlPipe
, men med kapslade CLR-lagrade procedurer kan utdatakonsumenten också vara en lagrad procedur. Till exempel anropar Procedure1
SqlCommand.ExecuteReader()
med kommandotexten EXEC Procedure2
.
Procedure2
är också en hanterad lagrad procedur. Om Procedure2
nu anropar SqlPipe.Send(SqlDataRecord)
skickas raden till läsaren i Procedure1
, inte klienten.
Metoden Send
skickar ett strängmeddelande som visas på klienten som ett informationsmeddelande, motsvarande PRINT
i Transact-SQL. Den kan också skicka en resultatuppsättning med en rad med SqlDataRecord
eller en resultatuppsättning med flera rader med hjälp av en SqlDataReader
.
SqlPipe
-objektet har också en ExecuteAndSend
-metod. Den här metoden kan användas för att köra ett kommando (skickas som ett SqlCommand
-objekt) och skicka resultat direkt tillbaka till anroparen. Om det finns fel i kommandot som skickades skickas undantag till röret och en kopia skickas till anropande hanterad kod. Om den anropande koden inte fångar undantaget sprids stacken till Transact-SQL-koden och visas i utdata två gånger. Om den anropande koden fångar undantaget ser pipkonsumenten fortfarande felet, men det finns inget duplicerat fel.
Det kan bara ta en SqlCommand
som är associerad med kontextanslutningen. Det går inte att ta ett kommando som är associerat med icke-kontextanslutningen.
Returnera anpassade resultatuppsättningar
Hanterade lagrade procedurer kan skicka resultatuppsättningar som inte kommer från en SqlDataReader
. Med metoden SendResultsStart
, tillsammans med SendResultsRow
och SendResultsEnd
, kan lagrade procedurer skicka anpassade resultatuppsättningar till klienten.
SendResultsStart
tar en SqlDataRecord
som indata. Den markerar början på en resultatuppsättning och använder postmetadata för att konstruera metadata som beskriver resultatuppsättningen. Det skickar inte värdet för posten med SendResultsStart
. Alla efterföljande rader som skickas med SendResultsRow
måste matcha metadatadefinitionen.
När du har anropat metoden SendResultsStart
kan bara SendResultsRow
och SendResultsEnd
anropas. Om du anropar någon annan metod i samma instans av SqlPipe
orsakas en InvalidOperationException
.
SendResultsEnd
anger SqlPipe
tillbaka till det ursprungliga tillståndet där andra metoder kan anropas.
Exempel
Den uspGetProductLine
lagrade proceduren returnerar namn, produktnummer, färg och listpris för alla produkter inom en angiven produktlinje. Den här lagrade proceduren accepterar exakta matchningar för 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.
}
}
}
};
Följande Transact-SQL-instruktion kör uspGetProduct
-proceduren, som returnerar en lista över touringcykelprodukter.
EXECUTE uspGetProductLineVB 'T';