Modificare i dati con procedure archiviate

Si applica a: .NET Framework .NET .NET Standard

Scarica ADO.NET

Le stored procedure possono accettare dati come parametri di input e possono restituire dati come parametri di output, set di risultati o valori restituiti. L'esempio seguente illustra il modo in cui il provider di dati Microsoft SqlClient per SQL Server invia e riceve i parametri di input, di output e i valori restituiti. Nell'esempio viene inserito un nuovo record in una tabella in cui la colonna chiave primaria è una colonna Identity.

Nota

Se si utilizzano stored procedure per modificare o eliminare dei dati tramite un SqlDataAdapter, assicurarsi di non utilizzare SET NOCOUNT ON nella definizione della stored procedure. Con tale comando il totale restituito delle righe interessate è pari a zero e tale situazione viene interpretata da DataAdapter come un conflitto di concorrenza. In tal caso, verrà generata l'eccezione DBConcurrencyException.

Esempio

L'esempio usa la seguente stored procedure per inserire una nuova categoria nella tabella NorthwindCategories. La stored procedure accetta il valore nella colonna CategoryName come parametro di input e usa la funzione SCOPE_IDENTITY() per recuperare il nuovo valore nel campo Identity, CategoryID, e restituirlo come parametro di output. L'istruzione RETURN utilizza la funzione @@ROWCOUNT per restituire il numero di righe inserite.

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

Nell'esempio di codice seguente, viene usata la procedura memorizzata InsertCategory illustrata sopra come origine per InsertCommand di SqlDataAdapter. Il parametro di output @Identity si rifletterà in DataSet dopo che il record è stato inserito nel database quando viene chiamato il metodo Update di SqlDataAdapter. Nel codice viene inoltre recuperato il valore restituito:

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";
    }
}

Vedi anche