C# – Erhalten Sie eingefügten Identitätswert mit Dapper

C# – Erhalten Sie eingefügten Identitätswert mit Dapper

Wenn Sie einen Datensatz in eine Tabelle mit einer Identitätsspalte einfügen, wird der Wert für die Identitätsspalte automatisch für Sie generiert. Der einfachste Weg, den eingefügten Identitätswert zu erhalten, besteht darin, OUTPUT INSERTED. in die Einfügeanweisung einzufügen:

INSERT INTO Orders
(CustomerId, Status, StoreId)
OUTPUT INSERTED.OrderId
VALUES
(@CustomerID, @Status, @StoreId)
Code language: SQL (Structured Query Language) (sql)

Um den Ausgabewert mit Dapper zu erhalten, verwenden Sie ExecuteScalar():

public int InsertOrder(Order order)
{
	using (var con = new SqlConnection(ConnectionString))
	{
		var identity = con.ExecuteScalar<int>(INSERT_SQL, param: order);
		return identity;
	}
}
Code language: C# (cs)

Dies fügt die neue Zeile ein und gibt die generierte Identitäts-Ganzzahl zurück:

75129Code language: plaintext (plaintext)

Hinweis:Dies entspricht der Verwendung von QuerySingle(). Ich bevorzuge die Verwendung von ExecuteScalar(), da ihr einziger Zweck darin besteht, einen einzelnen Wert abzurufen, sodass die Absicht klar ist. QuerySingle wird normalerweise verwendet, um eine einzelne Zeile abzurufen und sie einem Objekt zuzuordnen.

Verwenden Sie QuerySingle(), wenn Sie mehrere Spalten ausgeben

Angenommen, Sie möchten mehrere Spalten aus der eingefügten Zeile zurückgeben. Sie können OUTPUT INSERTED.* in der Insert-Anweisung verwenden (oder die Spaltennamen wie gezeigt eingeben):

INSERT INTO Orders
(CustomerId, Status, StoreId)
OUTPUT INSERTED.OrderId, INSERTED.CustomerId, INSERTED.Status, INSERTED.StoreId
VALUES
(@CustomerID, @Status, @StoreId)
Code language: SQL (Structured Query Language) (sql)

Verwenden Sie bei Dapper QuerySingle(), um die Ausgabespalten einem Objekt zuzuordnen:

public Order InsertOrder(Order orderToInsert)
{
	using (var con = new SqlConnection(ConnectionString))
	{
		var insertedOrder = con.QuerySingle<Order>(INSERT_SQL, param: orderToInsert);
		return insertedOrder;
	}
}
Code language: C# (cs)

Dadurch wird die neue Bestellzeile eingefügt und alle Spalten zurückgegeben, die Dapper einem Bestellobjekt zuordnet (dargestellt als JSON):

{
  "OrderId": 75131,
  "CustomerId": 1,
  "Status": "New",
  "StoreId": 1
}Code language: JSON / JSON with Comments (json)

Aktualisierungen, Löschungen und mehrere Ausgabezeilen

Sie können aktualisierte und gelöschte Werte genauso ausgeben wie eingefügte Werte. Wann immer Sie Daten ändern, sind Werte in den speziellen temporären Tabellen INSERTED und DELETED verfügbar.

  • INSERT – Werte, die Sie einfügen, sind in INSERTED verfügbar.
  • UPDATE – Alte Werte sind in DELETED. Neue Werte sind in INSERTED.
  • DELETE – Werte, die Sie gelöscht haben, befinden sich in DELETED.

Diese Werte gelten pro geänderter Zeile. Das bedeutet, wenn Sie mehrere Zeilen ändern und Werte aus INSERTED/DELETED ausgeben, erhalten Sie mehrere Zeilen mit Ausgabewerten zurück. Verwenden Sie bei Dapper Query(), um die mehreren Ausgabezeilen abzurufen.

Angenommen, Sie löschen eine Reihe stornierter Bestellungen und möchten die IDs der gelöschten Bestellungen ausgeben.

Fügen Sie zuerst OUTPUT DELETED. in die Löschanweisung ein:

DELETE FROM Orders
OUTPUT DELETED.OrderId
WHERE [Status]='Canceled'
Code language: SQL (Structured Query Language) (sql)

Verwenden Sie bei Dapper Query(), um alle gelöschten Bestell-IDs abzurufen:

public IEnumerable<int> DeleteCanceledOrders()
{
	using (var con = new SqlConnection(ConnectionString))
	{
		var deletedOrderIds = con.Query<int>(DELETE_SQL);
		return deletedOrderIds;
	}
}
Code language: C# (cs)

Dadurch werden mehrere Bestellungen gelöscht und die folgenden gelöschten Bestell-IDs (als JSON-Array angezeigt) ausgegeben:

[
  43659,
  43660,
  43661
]Code language: JSON / JSON with Comments (json)