Udostępnij przez


Obiekt SqlPipe

W poprzednich wersjach SQL Server, jest ono często zapisać procedura przechowywana (lub rozszerzone procedura przechowywana), wyniki lub parametrów wyjściowych, wysyła do klient wywołującego.

W Transact-SQL wszelkie przechowywanej procedury, SELECTInstrukcja, która zwraca wartość zero lub więcej wierszy wysyła wyniki do połączonego obiektu wywołującego "potoku. „

Dla plików wykonywalnych języka wspólnego (CLR) bazy danych w obiektach SQL Server, wyniki można wysłać do potoku połączonych za pomocą Send metody SqlPipe obiekt. Dostęp Pipe Właściwość SqlContext obiekt, aby uzyskać SqlPipe obiekt. The SqlPipe class is conceptually similar to the Response class found in ASP.NET.Aby uzyskać więcej informacji można znaleźć w dokumentacji odwołanie SqlPipe klasy programu .NET Framework SDK.

Zwracanie wyniki tabelarycznych i wiadomości

The SqlPipe has a Send metoda, which has three overloads. Są to:

  • void Send(string message)

  • void Send(SqlDataReader reader)

  • void Send(SqlDataRecord record)

The Send metoda sends data straight to the klient or caller. Zazwyczaj jest klient, który pobiera dane wyjściowe z SqlPipe, ale przypadek procedur zagnieżdżonych CLR przechowywane konsumenta dane wyjściowe mogą być również procedura przechowywana. Na przykład Procedure1 wywołuje SqlCommand.ExecuteReader() tekstem polecenia "EXEC Procedure2".Procedure2 jest również zarządzane procedura przechowywana.Jeśli Procedure2 wywołuje teraz SqlPipe.Send (SqlDataRecord), wiersz jest wysyłane do firmy Procedure1 czytnika, nie klient.

The Send metoda sends a ciąg message that appears on the klient as an information message, equivalent to PRINT in Transact-SQL. Może również wysłać przy użyciu zestaw wyników jedno wiersz SqlDataRecord, lub multi-row zestaw wyników za pomocą SqlDataReader.

The SqlPipe object also has an ExecuteAndSend metoda. Tej metoda można użyć do wykonać polecenia (jako SqlCommand obiekt) i Wyślij wyniki bezpośrednio do obiektu wywołującego. Jeśli występują błędy w poleceniu, który został przesłany, wyjątki są wysyłane do potoku, ale kopia będzie również wysyłany do wywoływania kod zarządzany.Jeśli kod wywołujący nie przechwytywać wyjątku, propaguje górę stosu do Transact-SQL Kod i pojawia się dwukrotnie w danych wyjściowych. Jeśli kod wywołujący przechwycić tego wyjątku, konsument potoku nadal będzie widział ten błąd, ale jest błąd zduplikowanego.

Tylko potrafi SqlCommand skojarzona z połączenia kontekstu; nie może zająć polecenie, które jest skojarzone z połączenia bez kontekstu.

Zwracanie zestawy wyników niestandardowych

Zarządzane procedury przechowywane mogą wysyłać zestawów wyników, które nie pochodzą z SqlDataReader. The SendResultsStart metoda, along with SendResultsRow and SendResultsEnd, allows stored procedures to send custom result sets to the klient.

SendResultsStart Trwa SqlDataRecord jako dane wejściowe. Oznacza początek zestaw wyników i używa rekordu metadane w celu skonstruowania metadane, które opisano zestaw wyników.Nie wysyła wartości w rekordzie z SendResultsStart. Wszystkie pozostałe wiersze, wysłane przy użyciu SendResultsRow, musi być taka sama definicja metadane.

Uwaga

Po telefonicznej SendResultsStart tylko metoda SendResultsRow i SendResultsEnd może zostać wywołana. Calling any other method in the same instance of SqlPipe causes an InvalidOperationException.SendResultsEnd sets SqlPipe back to the initial state in which other methods can be called.

Przykład

The uspGetProductLine procedura przechowywana returns the name, product number, color, and list price of all products within a specified product line. Ta procedura przechowywana akceptuje dokładne odpowiedniki dla 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

Poniżej Transact-SQL wykonuje instrukcję uspGetProduct Procedura, która zwraca listę produktów rowerów do roweru turystycznego.

EXEC uspGetProductLineVB 'T'