Udostępnij za pośrednictwem


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 SqlDataRecordlub 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 SendResultsRowmuszą 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';