Desde SQL Server 2008 hubo un OUTPUT clause agregado a la sintaxis de TSQL. Esto le permite tener los datos que se ven afectados por la consulta DML agregada al flujo de datos tabulares.
Aunque consultar SCOPE_IDENTITY() después de que una consulta devuelve la información correcta, obliga a SQL Server a ejecutar 2 consultas donde la cláusula de salida limita esto a una consulta.
Sabiendo esto, la consulta que se está ejecutando se pueden modificar de la siguiente manera (suponiendo [Id]
es el nombre de la identidad):
INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated)
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date)
Otro problema no se deshaga de la SqlCommand
. La mayoría de los objetos Sql...
en ADO.net implementan IDisposable
y deben eliminarse de manera adecuada.
Llevar todo junto me gustaría poner en práctica este pedazo de código como sigue:
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
using (var cmd = new SqlCommand(@"
INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated)
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn))
{
cmd.Parameters.AddRange(new[]
{
new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID,
new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey,
new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName,
new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now
});
conn.Open();
var id = (int)cmd.ExecuteScalar();
}
No se puede obtener a su pregunta, ¿desea el valor de inicialización de la fila acaba de insertar? –