Delen via


SqlPipe-object

van toepassing op:SQL Server-

In eerdere versies van SQL Server was het gebruikelijk om een opgeslagen procedure (of een uitgebreide opgeslagen procedure) te schrijven die resultaten of uitvoerparameters naar de aanroepende client heeft verzonden.

In een Transact-SQL opgeslagen procedure verzendt elke SELECT instructie die nul of meer rijen retourneert de resultaten naar de 'pipe' van de verbonden beller.

Voor CLR-databaseobjecten (Common Language Runtime) die worden uitgevoerd in SQL Server, kunt u resultaten verzenden naar de verbonden pijp met behulp van de Send methoden van het SqlPipe-object. Open de eigenschap Pipe van het SqlContext-object om het SqlPipe-object te verkrijgen. De SqlPipe klasse is conceptueel vergelijkbaar met de Response klasse in ASP.NET.

Zie Microsoft.SqlServer.Server.SqlPipevoor meer informatie.

Resultaten en berichten in tabelvorm retourneren

Het SqlPipe-object heeft een Send methode, die drie overbelastingen heeft. Dit zijn:

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

De methode Send verzendt gegevens rechtstreeks naar de client of aanroeper. Dit is meestal de client die de uitvoer van de SqlPipeverbruikt, maar met geneste CLR-opgeslagen procedures kan de uitvoerconsumer ook een opgeslagen procedure zijn. Procedure1 roept bijvoorbeeld SqlCommand.ExecuteReader() aan met de opdrachttekst EXEC Procedure2. Procedure2 is ook een beheerde opgeslagen procedure. Als Procedure2 nu SqlPipe.Send(SqlDataRecord)aanroept, wordt de rij in Procedure1naar de lezer verzonden, niet naar de client.

De methode Send verzendt een tekenreeksbericht dat op de client wordt weergegeven als een informatiebericht, vergelijkbaar met PRINT in Transact-SQL. Het kan ook een resultatenset met één rij verzenden met behulp van SqlDataRecordof een resultatenset met meerdere rijen met behulp van een SqlDataReader.

Het SqlPipe-object heeft ook een ExecuteAndSend methode. Deze methode kan worden gebruikt om een opdracht uit te voeren (doorgegeven als een SqlCommand-object) en resultaten rechtstreeks terug te sturen naar de aanroeper. Als er fouten zijn opgetreden in de opdracht die is verzonden, worden uitzonderingen naar de pijp verzonden en wordt er een kopie verzonden naar het aanroepen van beheerde code. Als de aanroepende code de uitzondering niet ondervangt, wordt de stack doorgegeven aan de Transact-SQL code en wordt deze twee keer weergegeven in de uitvoer. Als de aanroepende code de uitzondering ondervangt, ziet de pipe-consument nog steeds de fout, maar er is geen dubbele fout.

Er kan alleen een SqlCommand worden gebruikt die is gekoppeld aan de contextverbinding; er kan geen opdracht worden uitgevoerd die is gekoppeld aan de niet-contextverbinding.

Aangepaste resultatensets retourneren

Beheerde opgeslagen procedures kunnen resultatensets verzenden die niet afkomstig zijn van een SqlDataReader. Met de methode SendResultsStart, samen met SendResultsRow en SendResultsEnd, kunnen opgeslagen procedures aangepaste resultatensets naar de client verzenden.

SendResultsStart neemt een SqlDataRecord als invoer. Het markeert het begin van een resultatenset en gebruikt de metagegevens van de record om de metagegevens te maken die de resultatenset beschrijven. De waarde van de record wordt niet met SendResultsStartverzonden. Alle volgende rijen, die worden verzonden met SendResultsRow, moeten overeenkomen met die metagegevensdefinitie.

Nadat u de methode SendResultsStart hebt aangeroepen, kunnen alleen SendResultsRow en SendResultsEnd worden aangeroepen. Het aanroepen van een andere methode in hetzelfde exemplaar van SqlPipe veroorzaakt een InvalidOperationException. SendResultsEnd stelt SqlPipe weer in op de beginstatus waarin andere methoden kunnen worden aangeroepen.

Voorbeeld

De uspGetProductLine opgeslagen procedure retourneert de naam, het productnummer, de kleur en de catalogusprijs van alle producten binnen een opgegeven productlijn. Deze opgeslagen procedure accepteert exacte overeenkomsten voor 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.
        }
     }
}
};

De volgende Transact-SQL instructie voert de uspGetProduct procedure uit, waarmee een lijst met toerfietsproducten wordt geretourneerd.

EXECUTE uspGetProductLineVB 'T';