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


Объект SqlPipe

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

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

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

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

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

  • void Send(string message)

  • void Send(SqlDataReader reader)

  • void Send(SqlDataRecord record)

Метод Send отправляет данные непосредственно клиенту или вызывающему объекту. Обычно клиент использует выходные данные из SqlPipeобъекта, но в случае вложенных хранимых процедур CLR выходной потребитель также может быть хранимой процедурой. Например, Procedure1 вызывает SqlCommand.ExecuteReader() с текстом команды EXEC Procedure2. Процедура 2 также является управляемой хранимой процедурой. Если процедура2 теперь вызывает 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.

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  

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

EXEC uspGetProductLineVB 'T';  

См. также

Объект SqlDataRecord
Хранимые процедуры CLR
Расширения In-Process SQL Server для ADO.NET