Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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';