Megosztás a következőn keresztül:


SqlPipe objektum

A következőkre vonatkozik:SQL Server

Az SQL Server korábbi verzióiban gyakran előfordult, hogy olyan tárolt eljárást (vagy kiterjesztett tárolt eljárást) írtak, amely eredményeket vagy kimeneti paramétereket küldött a hívó ügyfélnek.

Egy Transact-SQL tárolt eljárásban minden olyan SELECT utasítás, amely nullát vagy több sort ad vissza, elküldi az eredményeket a csatlakoztatott hívó "csőjének".

Az SQL Serveren futó gyakori nyelvi futtatókörnyezeti (CLR) adatbázis-objektumok esetében az eredményeket a csatlakoztatott csőbe küldheti a SqlPipe objektum Send metódusával. A SqlContext objektum Pipe tulajdonságához férhet hozzá a SqlPipe objektum beszerzéséhez. A SqlPipe osztály fogalmilag hasonló a ASP.NET található Response osztályhoz.

További információ: Microsoft.SqlServer.Server.SqlPipe.

Táblázatos eredményeket és üzeneteket ad vissza

A SqlPipe objektum egy Send metódussal rendelkezik, amely három túlterheléssel rendelkezik. Ők vannak:

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

A Send metódus közvetlenül az ügyfélnek vagy a hívónak küld adatokat. Általában az ügyfél használja a SqlPipekimenetét, de beágyazott CLR-tárolt eljárásokkal a kimeneti fogyasztó is lehet tárolt eljárás. Például Procedure1SqlCommand.ExecuteReader() a parancsszöveggel EXEC Procedure2. Procedure2 egy felügyelt tárolt eljárás is. Ha Procedure2 most SqlPipe.Send(SqlDataRecord)hív meg, a sor nem az ügyfélnek, hanem Procedure1az olvasónak lesz elküldve.

A Send metódus egy olyan sztringüzenetet küld, amely információs üzenetként jelenik meg az ügyfélen, egyenértékű a Transact-SQL PRINT. Egysoros eredményhalmazt is küldhet SqlDataRecord, vagy többsoros eredményhalmazt SqlDataReaderhasználatával.

A SqlPipe objektum ExecuteAndSend metódust is használ. Ez a módszer egy parancs végrehajtására használható (SqlCommand objektumként továbbítva), és az eredményeket közvetlenül a hívónak küldi vissza. Ha az elküldött parancs hibákat tartalmaz, a rendszer kivételeket küld a csőbe, és másolatot küld a rendszer a felügyelt kód meghívására. Ha a hívó kód nem észleli a kivételt, propagálja a vermet a Transact-SQL kódra, és kétszer jelenik meg a kimenetben. Ha a hívó kód nem észleli a kivételt, a csőfelhasználó továbbra is látja a hibát, de nincs ismétlődő hiba.

Csak olyan SqlCommand vehet igénybe, amely a környezeti kapcsolathoz van társítva; Nem tud olyan parancsot átvenni, amely a nem környezeti kapcsolathoz van társítva.

Egyéni eredményhalmazok visszaadása

A felügyelt tárolt eljárások olyan eredményhalmazokat küldhetnek, amelyek nem SqlDataReaderszármaznak. A SendResultsStart metódus a SendResultsRow és a SendResultsEndmellett lehetővé teszi, hogy a tárolt eljárások egyéni eredményhalmazokat küldjenek az ügyfélnek.

SendResultsStart bemenetként egy SqlDataRecord vesz fel. Az eredményhalmaz elejét jelöli, és a rekord metaadataival hozza létre az eredményhalmazt leíró metaadatokat. Nem küldi el a rekord értékét SendResultsStart. Az SendResultsRowhasználatával küldött összes további sornak meg kell egyeznie ezzel a metaadat-definícióval.

A SendResultsStart metódus meghívása után csak SendResultsRow és SendResultsEnd hívható meg. A SqlPipe ugyanazon példányában található bármely más metódus meghívása InvalidOperationExceptionokoz. SendResultsEnd beállítja, SqlPipe vissza a kezdeti állapotba, amelyben más metódusok hívhatók meg.

Példa

A uspGetProductLine tárolt eljárás egy adott terméksoron belüli összes termék nevét, termékszámát, színét és listaárát adja vissza. Ez a tárolt eljárás pontos egyezéseket fogad el 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.
        }
     }
}
};

Az alábbi Transact-SQL utasítás végrehajtja a uspGetProduct eljárást, amely visszaadja a túrakerékpár-termékek listáját.

EXECUTE uspGetProductLineVB 'T';