SqlPipe, obiekt
Dotyczy:programu SQL Server
W poprzednich wersjach programu SQL Server często było pisać procedurę składowaną (lub rozszerzoną procedurę składowaną), która wysyłała wyniki lub parametry wyjściowe do wywołującego klienta.
W procedurze składowanej Transact-SQL każda instrukcja SELECT
zwracająca zero lub więcej wierszy wysyła wyniki do "potoku" połączonego wywołującego.
W przypadku obiektów bazy danych środowiska uruchomieniowego języka wspólnego (CLR) uruchomionych w programie SQL Server można wysyłać wyniki do połączonego potoku przy użyciu metod Send
obiektu SqlPipe
. Uzyskaj dostęp do właściwości Pipe
obiektu SqlContext
w celu uzyskania obiektu SqlPipe
. Klasa SqlPipe
jest koncepcyjnie podobna do klasy Response
znalezionej w ASP.NET.
Aby uzyskać więcej informacji, zobacz Microsoft.SqlServer.Server.SqlPipe.
Zwracanie wyników tabelarycznych i komunikatów
Obiekt SqlPipe
ma metodę Send
, która ma trzy przeciążenia. Są to:
void Send(string message)
void Send(SqlDataReader reader)
void Send(SqlDataRecord record)
Metoda Send
wysyła dane bezpośrednio do klienta lub obiektu wywołującego. Zazwyczaj klient korzysta z danych wyjściowych z SqlPipe
, ale w przypadku zagnieżdżonych procedur składowanych CLR odbiorca danych wyjściowych może być również procedurą składowaną. Na przykład Procedure1
wywołuje SqlCommand.ExecuteReader()
z tekstem polecenia EXEC Procedure2
.
Procedure2
jest również zarządzaną procedurą składowaną. Jeśli Procedure2
teraz wywołuje SqlPipe.Send(SqlDataRecord)
, wiersz jest wysyłany do czytnika w Procedure1
, a nie do klienta.
Metoda Send
wysyła komunikat ciągu wyświetlany na kliencie jako komunikat informacyjny, odpowiadający PRINT
w języku Transact-SQL. Może również wysyłać zestaw wyników z jednym wierszem przy użyciu SqlDataRecord
lub zestawu wyników z wieloma wierszami przy użyciu SqlDataReader
.
Obiekt SqlPipe
ma również metodę ExecuteAndSend
. Ta metoda może służyć do wykonywania polecenia (przekazanego jako obiekt SqlCommand
) i wysyłania wyników bezpośrednio do obiektu wywołującego. Jeśli w przesłaniu polecenia występują błędy, wyjątki są wysyłane do potoku, a kopia jest wysyłana do wywoływania kodu zarządzanego. Jeśli kod wywołujący nie przechwyci wyjątku, propaguje stos do kodu Transact-SQL i pojawia się w danych wyjściowych dwa razy. Jeśli kod wywołujący przechwyci wyjątek, odbiorca potoku nadal widzi błąd, ale nie ma zduplikowanego błędu.
Może to przyjmować tylko SqlCommand
skojarzone z połączeniem kontekstowym; nie może podjąć polecenia skojarzonego z połączeniem niezwiązanym z kontekstem.
Zwracanie niestandardowych zestawów wyników
Zarządzane procedury składowane mogą wysyłać zestawy wyników, które nie pochodzą z SqlDataReader
. Metoda SendResultsStart
, wraz z SendResultsRow
i SendResultsEnd
, umożliwia procedurom składowanych wysyłanie niestandardowych zestawów wyników do klienta.
SendResultsStart
przyjmuje SqlDataRecord
jako dane wejściowe. Oznacza początek zestawu wyników i używa metadanych rekordu do konstruowania metadanych opisujących zestaw wyników. Nie wysyła ona wartości rekordu z SendResultsStart
. Wszystkie kolejne wiersze wysyłane przy użyciu SendResultsRow
muszą być zgodne z definicją metadanych.
Po wywołaniu metody SendResultsStart
można wywołać tylko SendResultsRow
i SendResultsEnd
. Wywołanie dowolnej innej metody w tym samym wystąpieniu SqlPipe
powoduje InvalidOperationException
.
SendResultsEnd
ustawia SqlPipe
z powrotem do stanu początkowego, w którym można wywołać inne metody.
Przykład
Procedura składowana uspGetProductLine
zwraca nazwę, numer produktu, kolor i cenę katalogową wszystkich produktów w ramach określonej linii produktu. Ta procedura składowana akceptuje dokładne dopasowania dla 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.
}
}
}
};
Poniższa instrukcja Transact-SQL wykonuje procedurę uspGetProduct
, która zwraca listę produktów rowerów turystycznych.
EXECUTE uspGetProductLineVB 'T';
Powiązana zawartość
- obiektu
SqlDataRecord - procedur składowanych CLR
- rozszerzenia specyficzne dla programu SQL Server do ADO.NET