Поделиться через


Объект SqlPipe

Область применения:SQL Server

В предыдущих версиях SQL Server обычно записывает хранимую процедуру (или расширенную хранимую процедуру), отправляющую результаты или выходные параметры вызывающему клиенту.

В хранимой процедуре Transact-SQL любая инструкция SELECT, возвращающая нулю или больше строк, отправляет результаты в канал подключенного вызывающего абонента.

Для объектов базы данных среды CLR, работающих в SQL Server, можно отправлять результаты в подключенный канал с помощью методов Send объекта SqlPipe. Перейдите к свойству Pipe объекта SqlContext, чтобы получить объект SqlPipe. Класс SqlPipe концептуально похож на класс Response, найденный в ASP.NET.

Дополнительные сведения см. в разделе Microsoft.SqlServer.Server.SqlPipe.

Возврат табличных результатов и сообщений

Объект SqlPipe имеет метод Send, имеющий три перегрузки. В их число входят:

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

Метод Send отправляет данные непосредственно клиенту или вызывающему объекту. Обычно это клиент, который использует выходные данные из SqlPipe, но с вложенными хранимыми процедурами CLR, выходной потребитель также может быть хранимой процедурой. Например, Procedure1 вызывает SqlCommand.ExecuteReader() с текстом команды EXEC Procedure2. Procedure2 также является управляемой хранимой процедурой. Если Procedure2 теперь вызывает SqlPipe.Send(SqlDataRecord), строка отправляется читателю в Procedure1, а не клиенту.

Метод Send отправляет строковое сообщение, которое отображается на клиенте как информационное сообщение, эквивалентное PRINT в Transact-SQL. Он также может отправлять результирующий набор с одной строкой с помощью SqlDataRecordили многострочного результирующий набор с помощью SqlDataReader.

Объект SqlPipe также имеет метод ExecuteAndSend. Этот метод можно использовать для выполнения команды (переданной как объект SqlCommand) и отправки результатов непосредственно вызывающей стороне. Если в отправленной команде возникают ошибки, исключения отправляются в канал, а копия отправляется вызову управляемого кода. Если вызывающий код не перехватывает исключение, он распространяет стек на Transact-SQL код и отображается в выходных данных дважды. Если вызывающий код перехватывает исключение, потребитель канала по-прежнему видит ошибку, но не существует повторяющихся ошибок.

Он может принимать только SqlCommand, связанный с подключением контекста; Не удается выполнить команду, связанную с подключением, не связанным с контекстным подключением.

Возврат пользовательских результирующих наборов

Управляемые хранимые процедуры могут отправлять результирующие наборы, не поступающие из SqlDataReader. Метод SendResultsStart вместе с SendResultsRow и SendResultsEndпозволяет хранимым процедурам отправлять пользовательские результирующие наборы клиенту.

SendResultsStart принимает SqlDataRecord в качестве входных данных. Он отмечает начало результирующего набора и при помощи метаданных записи составляет метаданные, описывающие результирующий набор. Он не отправляет значение записи с SendResultsStart. Все последующие строки, отправленные с помощью SendResultsRow, должны соответствовать определению метаданных.

После вызова метода SendResultsStart можно вызывать только SendResultsRow и SendResultsEnd. Вызов любого другого метода в том же экземпляре SqlPipe вызывает InvalidOperationException. SendResultsEnd задает SqlPipe обратно в исходное состояние, в котором можно вызывать другие методы.

Пример

Хранимая процедура uspGetProductLine возвращает имя, номер продукта, цвет и цену списка всех продуктов в указанной строке продукта. Эта хранимая процедура принимает точные совпадения для 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.
        }
     }
}
};

Следующая инструкция Transact-SQL выполняет процедуру uspGetProduct, которая возвращает список гастроловых продуктов велосипедов.

EXECUTE uspGetProductLineVB 'T';