Sdílet prostřednictvím


Objekt SqlPipe

platí pro:SQL Server

V předchozích verzích SQL Serveru bylo běžné psát uloženou proceduru (nebo rozšířenou uloženou proceduru), která odesílala výsledky nebo výstupní parametry volajícímu klientovi.

V Transact-SQL uložené procedury všechny příkazy SELECT, které vrátí nula nebo více řádků, odešle výsledky do "kanálu" připojeného volajícího.

Pro databázové objekty CLR (Common Language Runtime) spuštěné v SQL Serveru můžete odesílat výsledky do připojeného kanálu pomocí Send metod objektu SqlPipe. Získejte SqlPipe objektu pomocí Pipe vlastnosti objektu SqlContext. Třída SqlPipe je koncepčně podobná třídě Response nalezené v ASP.NET.

Další informace naleznete v tématu Microsoft.SqlServer.Server.SqlPipe.

Vrácení tabulkových výsledků a zpráv

Objekt SqlPipeSend metodu, která má tři přetížení. Jsou:

  • void Send(string message)
  • void Send(SqlDataReader reader)
  • void Send(SqlDataRecord record)

Metoda Send odesílá data přímo klientovi nebo volajícímu. Obvykle je to klient, který spotřebovává výstup z SqlPipe, ale s vnořenými uloženými procedurami CLR může být výstupní příjemce také uložená procedura. Například Procedure1 volání SqlCommand.ExecuteReader() s textem příkazu EXEC Procedure2. Procedure2 je také spravovaná uložená procedura. Pokud Procedure2 nyní volá SqlPipe.Send(SqlDataRecord), řádek se odešle čtenáři v Procedure1, nikoli klientovi.

Metoda Send odešle řetězcovou zprávu, která se v klientovi zobrazí jako informační zpráva, která odpovídá PRINT v jazyce Transact-SQL. Může také odeslat sadu výsledků s jedním řádkem pomocí SqlDataRecordnebo sady výsledků s více řádky pomocí SqlDataReader.

Objekt SqlPipe má také ExecuteAndSend metodu. Tuto metodu lze použít ke spuštění příkazu (předaného jako objekt SqlCommand) a odeslání výsledků přímo volajícímu. Pokud v odeslaném příkazu dojde k chybám, výjimky se odešlou do kanálu a kopie se odešle do volání spravovaného kódu. Pokud volající kód výjimku nezachytí, rozšíří zásobník do Transact-SQL kódu a zobrazí se ve výstupu dvakrát. Pokud volající kód zachytí výjimku, příjemce kanálu stále uvidí chybu, ale neexistuje duplicitní chyba.

Může trvat pouze SqlCommand, která je přidružena k kontextové připojení; nemůže provést příkaz, který je přidružený k připojení, které není kontextové.

Vrácení vlastních sad výsledků

Spravované uložené procedury mohou odesílat sady výsledků, které nepocházejí z SqlDataReader. Metoda SendResultsStart spolu s SendResultsRow a SendResultsEndumožňuje uloženým procedurám odesílat do klienta vlastní sady výsledků.

SendResultsStart jako vstup vezme SqlDataRecord. Označuje začátek sady výsledků a pomocí metadat záznamu vytvoří metadata, která popisují sadu výsledků. Neodesílá hodnotu záznamu pomocí SendResultsStart. Všechny následující řádky odeslané pomocí SendResultsRowmusí odpovídat této definici metadat.

Po volání metody SendResultsStart je možné volat pouze SendResultsRow a SendResultsEnd. Volání jakékoli jiné metody ve stejné instanci SqlPipe způsobí InvalidOperationException. SendResultsEnd nastaví SqlPipe zpět do počátečního stavu, ve kterém lze volat jiné metody.

Příklad

Uložená procedura uspGetProductLine vrátí název, číslo výrobku, barvu a ceníkovou cenu všech produktů v zadaném řádku produktu. Tato uložená procedura přijímá přesné shody pro 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.
        }
     }
}
};

Následující příkaz Transact-SQL spustí uspGetProduct proceduru, která vrátí seznam cestovních kol.

EXECUTE uspGetProductLineVB 'T';