C#:obtenga un valor de identidad insertado con Dapper

C#:obtenga un valor de identidad insertado con Dapper

Cuando inserta un registro en una tabla con una columna de identidad, el valor de la columna de identidad se genera automáticamente. La forma más sencilla de obtener el valor de identidad insertado es colocar OUTPUT INSERTED. en la declaración de inserción:

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

Para obtener el valor de salida con Dapper, use 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)

Esto inserta la nueva fila y devuelve el entero de identidad generado:

75129Code language: plaintext (plaintext)

Nota:Esto es equivalente a usar QuerySingle(). Prefiero usar ExecuteScalar(), porque su único propósito es obtener un solo valor, por lo que la intención es clara. QuerySingle generalmente se usa para obtener una sola fila y asignarla a un objeto.

Use QuerySingle() cuando genere varias columnas

Supongamos que desea devolver varias columnas de la fila insertada. Puede usar OUTPUT INSERTED.* (o escribir los nombres de las columnas como se muestra) en la declaración de inserción:

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, use QuerySingle() para asignar las columnas de salida a un objeto:

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)

Esto inserta la nueva fila de pedido y devuelve todas las columnas, que Dapper asigna a un objeto de pedido (que se muestra como JSON):

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

Actualizaciones, eliminaciones y múltiples filas de salida

Puede generar valores actualizados y eliminados de la misma manera que puede generar valores insertados. Cada vez que modifica datos, los valores están disponibles en las tablas temporales especiales INSERTADO y ELIMINADO.

  • INSERTAR:los valores que inserte están disponibles en INSERTADO.
  • ACTUALIZAR:los valores antiguos están en BORRADO. Los nuevos valores están en INSERTADO.
  • ELIMINAR:los valores que eliminó están en ELIMINADOS.

Estos valores son por fila modificada. Esto significa que si está modificando varias filas y generando valores de INSERTADO/ELIMINADO, obtendrá varias filas de valores de salida. Con Dapper, use Query() para obtener las múltiples filas de salida.

Por ejemplo, supongamos que está eliminando un montón de pedidos cancelados y desea mostrar los ID de pedidos eliminados.

Primero, coloque OUTPUT DELETED. en la declaración de eliminación:

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

Con Dapper, use Query() para obtener todos los ID de pedidos eliminados:

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

Esto elimina varios pedidos y genera los siguientes ID de pedidos eliminados (que se muestran como una matriz JSON):

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