SqlPipe-Objekt
Gilt für:SQL Server
In früheren Versionen von SQL Server war es üblich, eine gespeicherte Prozedur (oder eine erweiterte gespeicherte Prozedur) zu schreiben, die Ergebnisse oder Ausgabeparameter an den aufrufenden Client gesendet hat.
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 unter Microsoft.SqlServer.Server.SqlPipe.
Zurückgeben tabellarischer Ergebnisse und Nachrichten
Das SqlPipe
-Objekt verfügt über eine Send
Methode, die drei Überladungen aufweist. Es sind:
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 aus dem SqlPipe
verwendet, aber bei geschachtelten gespeicherten CLR-Prozeduren kann der Ausgabeverbraucher auch eine gespeicherte Prozedur sein. Beispielsweise ruft Procedure1
SqlCommand.ExecuteReader()
mit dem Befehlstext EXEC Procedure2
auf.
Procedure2
ist auch eine verwaltete gespeicherte Prozedur. Wenn Procedure2
jetzt SqlPipe.Send(SqlDataRecord)
aufruft, wird die Zeile in Procedure1
an den Leser 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 SqlDataRecord
oder einem Mehrzeilen-Resultset mithilfe einer SqlDataReader
senden.
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, und eine Kopie wird an den Aufruf von verwaltetem Code gesendet. Wenn der aufrufende Code die Ausnahme nicht erfasst, 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
dauern, die der Kontextverbindung zugeordnet ist; Es kann kein Befehl verwendet werden, der der nicht kontextbezogenen Verbindung zugeordnet ist.
Zurückgeben benutzerdefinierter Resultsets
Verwaltete gespeicherte Prozeduren können Resultsets senden, die nicht aus einer SqlDataReader
stammen. Mit der SendResultsStart
-Methode und SendResultsRow
und SendResultsEnd
kö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. Der Wert des Datensatzes wird nicht mit SendResultsStart
gesendet. Alle nachfolgenden Zeilen, die mit SendResultsRow
gesendet werden, müssen dieser Metadatendefinition entsprechen.
Nachdem Sie die SendResultsStart
-Methode aufgerufen haben, können nur SendResultsRow
und SendResultsEnd
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
.
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.
}
}
}
};
Die folgende Transact-SQL Anweisung führt die uspGetProduct
-Prozedur aus, die eine Liste der Tourenfahrradprodukte zurückgibt.
EXECUTE uspGetProductLineVB 'T';