Ändern von Daten mit gespeicherten Prozeduren
Gilt für: .NET Framework .NET .NET Standard
Gespeicherte Prozeduren können Daten als Eingabeparameter akzeptieren und Daten als Ausgabeparameter, Resultsets oder Rückgabewerte zurückgeben. Das folgende Beispiel veranschaulicht, wie Microsoft SqlClient-Datenanbieter für SQL Server die Eingabeparameter, Ausgabeparameter und Rückgabewerte sendet und empfängt. Im Beispiel wird ein neuer Datensatz in eine Tabelle eingefügt, in der die Spalte für den Primärschlüssel eine Identitätsspalte ist.
Hinweis
Wenn Sie gespeicherte Prozeduren verwenden, um Daten mithilfe einer SqlDataAdapter-Klasse zu bearbeiten oder zu löschen, stellen Sie sicher, dass Sie in der Definition der gespeicherten Prozedur nicht SET NOCOUNT ON verwenden. Anderenfalls ist die zurückgegebene Anzahl der betroffenen Zeilen gleich Null (0), was der DataAdapter
als Parallelitätskonflikt interpretiert. In diesem Fall wird eine DBConcurrencyException ausgelöst.
Beispiel
In diesem Beispiel wird die folgende gespeicherte Prozedur verwendet, um in die Categories-Tabelle der Northwind-Beispieldatenbank eine neue Kategorie einzufügen. Die gespeicherte Prozedur nimmt den Wert in der CategoryName-Spalte als Eingabeparameter, verwendet die SCOPE_IDENTITY() -Funktion, um den neuen Wert des Identitätsfelds CategoryID abzurufen, und gibt ihn als Ausgabeparameter zurück. Die RETURN-Anweisung gibt über die @@ROWCOUNT-Funktion die Anzahl der eingefügten Zeilen zurück.
CREATE PROCEDURE dbo.InsertCategory
@CategoryName nvarchar(15),
@Identity int OUT
AS
INSERT INTO Categories (CategoryName) VALUES(@CategoryName)
SET @Identity = SCOPE_IDENTITY()
RETURN @@ROWCOUNT
Im folgenden Codebeispiel wird die oben beschriebene gespeicherte Prozedur InsertCategory
als Quelle für den InsertCommand des SqlDataAdapter verwendet. Der @Identity
-Ausgabeparameter erscheint im DataSet, nachdem der Datensatz in die Datenbank eingefügt und die Update
-Methode des SqlDataAdapter aufgerufen wurde. Der Code ruft auch den Rückgabewert ab.
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";
}
}