Bagikan melalui


Mengubah data dengan prosedur tersimpan

Berlaku untuk: .NET Framework .NET .NET Standard

Mengunduh ADO.NET

Prosedur tersimpan bisa menerima data sebagai parameter input dan bisa mengembalikan data sebagai parameter output, tataan hasil, atau mengembalikan nilai. Sampel di bawah ini menggambarkan bagaimana Penyedia Data Microsoft SqlClient untuk SQL Server mengirim dan menerima parameter input, parameter output, dan mengembalikan nilai. Contoh menyisipkan rekaman baru ke dalam tabel di mana kolom kunci utama adalah kolom identitas.

Catatan

Jika Anda menggunakan prosedur tersimpan untuk mengedit atau menghapus data menggunakan SqlDataAdapter, pastikan Anda tidak menggunakan SET NOCOUNT ON dalam definisi prosedur tersimpan. Ini menyebabkan jumlah baris yang terpengaruh dikembalikan menjadi nol, yang ditafsirkan DataAdapter sebagai konflik konkurensi. Dalam hal ini, DBConcurrencyException akan dilemparkan.

Contoh

Sampel menggunakan prosedur tersimpan berikut untuk menyisipkan kategori baru ke dalam tabel Kategori Northwind. Prosedur tersimpan mengambil nilai di kolom CategoryName sebagai parameter input dan menggunakan fungsi SCOPE_IDENTITY() untuk mengambil nilai baru bidang identitas, CategoryID, dan mengembalikannya dalam parameter output. Pernyataan RETURN menggunakan fungsi @@ROWCOUNT untuk mengembalikan jumlah baris yang disisipkan.

CREATE PROCEDURE dbo.InsertCategory  
  @CategoryName nvarchar(15),  
  @Identity int OUT  
AS  
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)  
SET @Identity = SCOPE_IDENTITY()  
RETURN @@ROWCOUNT  

Contoh kode berikut menggunakan prosedur tersimpan yang InsertCategory ditunjukkan di atas sebagai sumber untuk InsertCommand dari SqlDataAdapter. Parameter @Identity output akan tercermin dalam DataSet setelah rekaman dimasukkan ke dalam database ketika metode Update dari SqlDataAdapter dipanggil. Kode juga mengambil nilai yang dikembalikan.

using System;
using System.Data;
using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        ReturnIdentity(connectionString);
        // Console.ReadLine();
    }

    private static void ReturnIdentity(string connectionString)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            // Create a SqlDataAdapter based on a SELECT query.
            SqlDataAdapter adapter = new SqlDataAdapter(
                "SELECT CategoryID, CategoryName FROM dbo.Categories", connection);

            // Create a SqlCommand to execute the stored procedure.
            adapter.InsertCommand = new SqlCommand("InsertCategory", connection);
            adapter.InsertCommand.CommandType = CommandType.StoredProcedure;

            // Create a parameter for the ReturnValue.
            SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@RowCount", SqlDbType.Int);
            parameter.Direction = ParameterDirection.ReturnValue;

            // Create an input parameter for the CategoryName.
            // You do not need to specify direction for input parameters.
            adapter.InsertCommand.Parameters.Add("@CategoryName", SqlDbType.NChar, 15, "CategoryName");

            // Create an output parameter for the new identity value.
            parameter = adapter.InsertCommand.Parameters.Add("@Identity", SqlDbType.Int, 0, "CategoryID");
            parameter.Direction = ParameterDirection.Output;

            // Create a DataTable and fill it.
            DataTable categories = new DataTable();
            adapter.Fill(categories);

            // Add a new row.
            DataRow categoryRow = categories.NewRow();
            categoryRow["CategoryName"] = "New Beverages";
            categories.Rows.Add(categoryRow);

            // Update the database.
            adapter.Update(categories);

            // Retrieve the ReturnValue.
            Int rowCount = (Int)adapter.InsertCommand.Parameters["@RowCount"].Value;

            Console.WriteLine("ReturnValue: {0}", rowCount.ToString());
            Console.WriteLine("All Rows:");
            foreach (DataRow row in categories.Rows)
            {
                    Console.WriteLine("  {0}: {1}", row[0], row[1]);
            }
        }
    }

    static private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Initial Catalog=Northwind;Integrated Security=true";
    }
}

Lihat juga