Ändra data med lagrade procedurer

Gäller för: .NET Framework .NET .NET Standard

Ladda ned ADO.NET

Lagrade procedurer kan acceptera data som indataparametrar och kan returnera data som utdataparametrar, resultatuppsättningar eller returvärden. Exemplet nedan visar hur Microsoft SqlClient Data Provider för SQL Server skickar och tar emot indataparametrar, utdataparametrar och returvärden. Exemplet infogar en ny post i en tabell där primärnyckelkolumnen är en identitetskolumn.

Anmärkning

Om du använder lagrade procedurer för att redigera eller ta bort data med hjälp av en SqlDataAdapterkontrollerar du att du inte använder SET NOCOUNT ON i definitionen för lagrad procedur. Detta gör att antalet rader som påverkas returneras till noll, vilket DataAdapter tolkas som en samtidighetskonflikt. I det fallet utlöses en DBConcurrencyException.

Example

Exemplet använder följande lagrade procedur för att infoga en ny kategori i tabellen NorthwindCategories . Den lagrade proceduren tar värdet i kolumnen CategoryName som indataparameter och använder funktionen SCOPE_IDENTITY() för att hämta det nya värdet för identitetsfältet CategoryID och returnera det i en utdataparameter. RETURN-instruktionen använder funktionen @@ROWCOUNT för att returnera antalet infogade rader.

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

I följande kodexempel används den InsertCategory lagrade proceduren som visas ovan som källa för InsertCommand av SqlDataAdapter. Utdataparametern @Identity kommer att återspeglas i DataSet efter att posten har infogats i databasen när Update metoden av SqlDataAdapter har anropats. Koden hämtar även returvärdet.

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

Se även