Bagikan melalui


Objek SqlPipe

Berlaku untuk:SQL Server

Dalam versi SQL Server sebelumnya, adalah umum untuk menulis prosedur tersimpan (atau prosedur tersimpan yang diperluas) yang mengirim hasil atau parameter output ke klien panggilan.

Dalam prosedur tersimpan Transact-SQL, pernyataan SELECT apa pun yang mengembalikan nol atau lebih baris mengirimkan hasilnya ke "pipa" pemanggil yang terhubung.

Untuk objek database runtime bahasa umum (CLR) yang berjalan di SQL Server, Anda dapat mengirim hasil ke pipa yang tersambung menggunakan metode Send objek SqlPipe. Akses properti Pipe objek SqlContext untuk mendapatkan objek SqlPipe. Kelas SqlPipe secara konseptual mirip dengan kelas Response yang ditemukan di ASP.NET.

Untuk informasi selengkapnya, lihat Microsoft.SqlServer.Server.SqlPipe.

Mengembalikan hasil dan pesan tabular

Objek SqlPipe memiliki metode Send, yang memiliki tiga kelebihan beban. Yaitu:

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

Metode Send mengirim data langsung ke klien atau pemanggil. Biasanya klien yang menggunakan output dari SqlPipe, tetapi dengan prosedur tersimpan CLR berlapis, konsumen output juga dapat menjadi prosedur tersimpan. Misalnya, Procedure1 memanggil SqlCommand.ExecuteReader() dengan teks perintah EXEC Procedure2. Procedure2 juga merupakan prosedur tersimpan terkelola. Jika Procedure2 sekarang memanggil SqlPipe.Send(SqlDataRecord), baris dikirim ke pembaca di Procedure1, bukan klien.

Metode Send mengirim pesan string yang muncul pada klien sebagai pesan informasi, setara dengan PRINT di Transact-SQL. Ini juga dapat mengirim tataan hasil baris tunggal menggunakan SqlDataRecord, atau tataan hasil multi-baris menggunakan SqlDataReader.

Objek SqlPipe juga memiliki metode ExecuteAndSend. Metode ini dapat digunakan untuk menjalankan perintah (diteruskan sebagai objek SqlCommand) dan mengirim hasil langsung kembali ke pemanggil. Jika ada kesalahan dalam perintah yang dikirimkan, pengecualian dikirim ke pipa, dan salinan dikirim ke memanggil kode terkelola. Jika kode panggilan tidak menangkap pengecualian, kode tersebut menyebarkan tumpukan ke kode Transact-SQL dan muncul dalam output dua kali. Jika kode panggilan menangkap pengecualian, konsumen pipa masih melihat kesalahan, tetapi tidak ada kesalahan duplikat.

Ini hanya dapat mengambil SqlCommand yang terkait dengan koneksi konteks; ini tidak dapat mengambil perintah yang terkait dengan koneksi non-konteks.

Mengembalikan tataan hasil kustom

Prosedur tersimpan terkelola dapat mengirim kumpulan hasil yang tidak berasal dari SqlDataReader. Metode SendResultsStart, bersama dengan SendResultsRow dan SendResultsEnd, memungkinkan prosedur tersimpan untuk mengirim kumpulan hasil kustom ke klien.

SendResultsStart mengambil SqlDataRecord sebagai input. Ini menandai awal kumpulan hasil dan menggunakan metadata rekaman untuk membuat metadata yang menjelaskan kumpulan hasil. Ini tidak mengirim nilai rekaman dengan SendResultsStart. Semua baris berikutnya, yang dikirim menggunakan SendResultsRow, harus cocok dengan definisi metadata tersebut.

Setelah Anda memanggil metode SendResultsStart, hanya SendResultsRow dan SendResultsEnd yang dapat dipanggil. Memanggil metode lain dalam instans SqlPipe yang sama menyebabkan InvalidOperationException. SendResultsEnd mengatur SqlPipe kembali ke status awal di mana metode lain dapat dipanggil.

Contoh

Prosedur tersimpan uspGetProductLine mengembalikan nama, nomor produk, warna, dan daftar harga semua produk dalam baris produk tertentu. Prosedur tersimpan ini menerima kecocokan yang tepat untuk 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.
        }
     }
}
};

Pernyataan Transact-SQL berikut menjalankan prosedur uspGetProduct, yang mengembalikan daftar produk sepeda tur.

EXECUTE uspGetProductLineVB 'T';