Megosztás a következőn keresztül:


Adatok módosítása tárolt eljárásokkal

A tárolt eljárások bemeneti paraméterekként fogadhatják el az adatokat, és kimeneti paraméterekként, eredményhalmazokként vagy visszaadott értékekként is visszaadhatják az adatokat. Az alábbi minta bemutatja, hogy ADO.NET hogyan küldi és fogadja a bemeneti paramétereket, a kimeneti paramétereket és a visszatérési értékeket. A példa egy új rekordot szúr be egy táblába, ahol az elsődleges kulcsoszlop egy identitásoszlop egy SQL Server-adatbázisban.

Feljegyzés

Ha sql serveres tárolt eljárásokat használ az adatok szerkesztéséhez vagy törléséhez egy SqlDataAdapterhasználatával, győződjön meg arról, hogy nem használja a SET NOCOUNT ON függvényt a tárolt eljárásdefinícióban. Ez azt eredményezi, hogy az érintett sorok száma nulla lesz, amelyet az DataAdapter egyidejűségütközésként értelmez. Ebben az esetben egy DBConcurrencyException lesz dobva.

Példa

A minta a következő tárolt eljárással szúr be egy új kategóriát a Northwind Categories táblába. A tárolt eljárás a CategoryName oszlopban lévő értéket bemeneti paraméterként veszi fel, és a SCOPE_IDENTITY() függvénnyel lekéri az identitásmező új értékét, a CategoryID értéket, és visszaadja egy kimeneti paraméterben. A RETURN utasítás a @@ROWCOUNT függvénnyel adja vissza a beszúrt sorok számát.

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

Az alábbi példakód a InsertCategory fent látható tárolt eljárást használja a forrásként a InsertCommand SqlDataAdapterkövetkező kódhoz: A @Identity kimeneti paraméter akkor jelenik meg, DataSet ha a rekordot beszúrták az adatbázisba a Update metódus meghívásakor SqlDataAdapter . A kód a visszatérési értéket is lekéri.

Feljegyzés

A használata esetén a OleDbDataAdaptertöbbi paraméter előtt meg kell adnia egy ParameterDirection ReturnValue paraméterrel rendelkező paramétereket.

using (SqlConnection connection = new(connectionString))
{
    // Create a SqlDataAdapter based on a SELECT query.
    SqlDataAdapter adapter = new("SELECT CategoryID, CategoryName FROM dbo.Categories", connection)
    {
        // Create a SqlCommand to execute the stored procedure.
        InsertCommand = new SqlCommand("InsertCategory", connection)
        {
            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();
    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.
    var 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]);
    }
}
Option Explicit On
Option Strict On

Imports System.Data
Imports System.Data.SqlClient

Module Class1

    Sub Main()
        Dim connectionString As String = _
            GetConnectionString()
        ReturnIdentity(connectionString)
        ' Console.ReadLine()
    End Sub


    Private Sub ReturnIdentity(ByVal connectionString As String)
        Using connection As SqlConnection = New SqlConnection( _
           connectionString)

            ' Create a SqlDataAdapter based on a SELECT query.
            Dim adapter As SqlDataAdapter = New SqlDataAdapter( _
               "SELECT CategoryID, CategoryName FROM dbo.Categories", _
               connection)

            ' Create a SqlCommand to execute the stored procedure.
            adapter.InsertCommand = New SqlCommand("dbo.InsertCategory", _
               connection)
            adapter.InsertCommand.CommandType = CommandType.StoredProcedure

            ' Create a parameter for the ReturnValue.
            Dim parameter As SqlParameter = _
               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.
            Dim categories As DataTable = New DataTable
            adapter.Fill(categories)

            ' Add a new row.
            Dim newRow As DataRow = categories.NewRow()
            newRow("CategoryName") = "New Category"
            categories.Rows.Add(newRow)

            ' Update the database.
            adapter.Update(categories)

            ' Retrieve the ReturnValue.
            Dim rowCount As Int32 = _
               CInt(adapter.InsertCommand.Parameters("@RowCount").Value)

            Console.WriteLine("ReturnValue: {0}", rowCount.ToString())
            Console.WriteLine("All Rows:")
            Dim row As DataRow
            For Each row In categories.Rows
                Console.WriteLine("  {0}: {1}", row(0), row(1))
            Next
        End Using
    End Sub

    Private Function GetConnectionString() As String
        Throw New NotImplementedException()
    End Function

End Module

Lásd még