C# – Ottieni il valore di identità inserito con Dapper

C# – Ottieni il valore di identità inserito con Dapper

Quando inserisci un record in una tabella con una colonna identità, il valore per la colonna identità viene generato automaticamente per te. Il modo più semplice per ottenere il valore di identità inserito è inserire OUTPUT INSERTED. nell'istruzione insert:

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

Per ottenere il valore di output con Dapper, usa 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)

Questo inserisce la nuova riga e restituisce l'intero di identità generato:

75129Code language: plaintext (plaintext)

Nota:equivale all'utilizzo di QuerySingle(). Preferisco usare ExecuteScalar(), perché il suo unico scopo è recuperare un singolo valore, quindi l'intenzione è chiara. QuerySingle viene solitamente utilizzato per recuperare una singola riga e associarla a un oggetto.

Utilizza QuerySingle() quando emetti più colonne

Supponiamo di voler restituire più colonne dalla riga inserita. Puoi utilizzare OUTPUT INSERTED.* (o digitare i nomi delle colonne come mostrato) nell'istruzione di inserimento:

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)

Con Dapper, usa QuerySingle() per mappare le colonne di output su un oggetto:

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)

Questo inserisce la nuova riga dell'ordine e restituisce tutte le colonne, che Dapper associa a un oggetto Order (mostrato come JSON):

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

Aggiorna, elimina e più righe di output

È possibile emettere valori aggiornati ed eliminati nello stesso modo in cui è possibile emettere valori inseriti. Ogni volta che modifichi i dati, i valori sono disponibili nelle tabelle temporanee speciali INSERTED e DELETED.

  • INSERT – I valori inseriti sono disponibili in INSERTED.
  • UPDATE – I vecchi valori sono in DELETED. I nuovi valori sono in INSERTED.
  • DELETE – I valori che hai eliminato sono in DELETED.

Questi valori sono per riga modificata. Ciò significa che se stai modificando più righe e emettendo valori da INSERTED/DELETED, otterrai più righe di valori di output. Con Dapper, usa Query() per ottenere più righe di output.

Ad esempio, supponiamo che tu stia eliminando un gruppo di ordini annullati e desideri visualizzare gli ID degli ordini eliminati.

Innanzitutto, inserisci OUTPUT DELETED. nell'istruzione di eliminazione:

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

Con Dapper, usa Query() per ottenere tutti gli ID ordine eliminati:

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

Questo elimina più ordini e restituisce i seguenti ID ordine eliminati (mostrati come un array JSON):

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