Freigeben über


SqlPipe-Objekt

In früheren Versionen von SQL Server wird häufig eine gespeicherte Prozedur (oder eine erweiterte gespeicherte Prozedur) geschrieben, die Ergebnisse oder Ausgabeparameter an den aufrufenden Client sendet.

In einer Transact-SQL gespeicherten Prozedur sendet jede SELECT-Anweisung, die null oder mehr Zeilen zurückgibt, die Ergebnisse an die "Pipe" des verbundenen Aufrufers.

Für clR-Datenbankobjekte (Common Language Runtime), die in SQL Server ausgeführt werden, können Sie Ergebnisse mithilfe der Send Methoden des SqlPipe-Objekts an die verbundene Pipe senden. Greifen Sie auf die Pipe-Eigenschaft des SqlContext-Objekts zu, um das SqlPipe-Objekt abzurufen. Die SqlPipe Klasse ist konzeptuell der Response Klasse in ASP.NET ähnlich. Weitere Informationen finden Sie in der Referenzdokumentation zur SqlPipe-Klasse im .NET Framework Software Development Kit.

Zurückgeben tabellarischer Ergebnisse und Nachrichten

Die SqlPipe Methode verfügt Send über drei Überladungen. Sie lauten wie folgt:

  • void Send(string message)

  • void Send(SqlDataReader reader)

  • void Send(SqlDataRecord record)

Die Send-Methode sendet Daten direkt an den Client oder Aufrufer. Es handelt sich in der Regel um den Client, der die Ausgabe von der SqlPipeDatei verwendet, aber im Falle geschachtelter CLR-gespeicherter Prozeduren kann der Ausgabeverbraucher auch eine gespeicherte Prozedur sein. Beispielsweise ruft Procedure1 SqlCommand.ExecuteReader() mit dem Befehlstext "EXEC Procedure2" auf. Prozedur2 ist auch eine verwaltete gespeicherte Prozedur. Wenn Procedure2 jetzt SqlPipe.Send( SqlDataRecord) aufruft, wird die Zeile an den Reader von Procedure1 gesendet, nicht an den Client.

Die Send Methode sendet eine Zeichenfolgenmeldung, die auf dem Client als Informationsnachricht angezeigt wird, die print in Transact-SQL entspricht. Es kann auch ein einzeileniges Resultset mithilfe von SqlDataRecordoder einem Mehrzeilen-Resultset mithilfe einer SqlDataReadersenden.

Das SqlPipe-Objekt verfügt auch über eine ExecuteAndSend Methode. Diese Methode kann verwendet werden, um einen Befehl (übergeben als SqlCommand-Objekt) auszuführen und Ergebnisse direkt an den Aufrufer zurückzusenden. Wenn fehler im übermittelten Befehl vorhanden sind, werden Ausnahmen an die Pipe gesendet, aber eine Kopie wird auch an den Aufruf von verwaltetem Code gesendet. Wenn der aufrufende Code die Ausnahme nicht abfangen kann, verteilt er den Stapel an den Transact-SQL Code und wird zweimal in der Ausgabe angezeigt. Wenn der aufrufende Code die Ausnahme abfangen kann, wird dem Pipe-Consumer weiterhin der Fehler angezeigt, es gibt jedoch keinen doppelten Fehler.

Es kann nur eine SqlCommand verbindung mit der Kontextverbindung verknüpfte Verbindung dauern. Es kann kein Befehl verwendet werden, der der nicht kontextbezogenen Verbindung zugeordnet ist.

Zurückgeben von benutzerdefinierten Resultsets

Verwaltete gespeicherte Prozeduren können Resultsets senden, die nicht aus einem SqlDataReader. Mit der SendResultsStart-Methode und SendResultsRow und SendResultsEndkönnen gespeicherte Prozeduren benutzerdefinierte Resultsets an den Client senden.

SendResultsStart akzeptiert eine SqlDataRecord als Eingabe. Die Methode kennzeichnet den Anfang eines Resultsets und erstellt mithilfe der Datensatzmetadaten die Metadaten zur Beschreibung des Resultsets. Er sendet nicht den Wert des Datensatzes mit SendResultsStart. Alle nachfolgenden Zeilen, die mit SendResultsRowgesendet werden, müssen dieser Metadatendefinition entsprechen.

Hinweis

Nach dem Aufruf der SendResultsStart Methode nur SendResultsRow und SendResultsEnd kann aufgerufen werden. Das Aufrufen einer anderen Methode in derselben Instanz von SqlPipe führt zu einer InvalidOperationException. SendResultsEnd legt SqlPipe auf den Anfangszustand zurück, in dem andere Methoden aufgerufen werden können.

Beispiel

Die gespeicherte Prozedur uspGetProductLine gibt den Namen, die Produktnummer, die Farbe und den Listenpreis aller Produkte innerhalb einer angegebenen Produktlinie zurück. Diese gespeicherte Prozedur akzeptiert genaue Übereinstimmungen für 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  

Die folgende Transact-SQL Anweisung führt die uspGetProduct-Prozedur aus, die eine Liste der Tourenfahrradprodukte zurückgibt.

EXEC uspGetProductLineVB 'T';  

Siehe auch

SqlDataRecord-Objekt
Gespeicherte CLR-Prozeduren
SQL Server In-Process spezifische Erweiterungen für ADO.NET