Estoy usando un objeto SqlCommand para insertar un registro en una tabla con una clave principal autogenerada. ¿Cómo puedo escribir el texto de comando para que obtenga el ID recién creado cuando uso el método ExecuteScalar()?¿Cómo insertar un registro y devolver el ID recién creado con un solo SqlCommand?
Respuesta
INSERT INTO YourTable(val1, val2, val3 ...)
VALUES(@val1, @val2, @val3...);
SELECT SCOPE_IDENTITY();
No olvide el punto y coma al final de cada instrucción.
en lugar de usar scope_identity(), solo podría usar la cláusula de salida - INSERT INTO YourTable (val1, val2, val3 ...) salida insertada. $ Identity VALUES (@ val1, @ val2, @ val3 ...); –
No, no puedes. Si su tabla tiene desencadenantes, obtendrá este error: La tabla de destino 'Sitio' de la declaración DML no puede tener activadores habilitados si la instrucción contiene una cláusula OUTPUT sin la cláusula INTO. – pilavdzice
insert into Yourtable()
values()
SELECT SCOPE_IDENTITY()
que acaba de ejecutar una prueba y verifica que los puntos y comas son opcionales utilizando SQL Server 2005 SP2, y .Net 3.5
No sé nada sobre el downvote, pero SET NOCOUNT ON no es necesario para que esto funcione. Podría ser el punto y coma que falta. –
en ADO 6.0 el conjunto no se requeriría si se retira un conjunto de registros, por lo tanto, podría ser ;-). Acabo de ejecutar una prueba y no necesita los puntos y coma y no necesita establecer nocount – JoshBerke
directamente de la Whirlpool:
If you're using MS SQL you can use "SELECT @@IDENTITY as Value" after your insert to get the last ID generated
y:
@@IDENTITY
andSCOPE_IDENTITY
return the last identity value generated in any table in the current session. However,SCOPE_IDENTITY
returns the value only within the current scope;@@IDENTITY
is not limited to a specific scope.
Editar: Como ou puntas t en los comentarios, siempre debe usar SCOPE_IDENTITY
, no @@IDENTITY
.
Si tiene algún activador @@ Identity puede devolver el valor incorrecto – JoshBerke
Siempre use SCOPE_IDENTITY. No @@ Identidad. –
Añada la siguiente línea al final de la consulta SQL ...
SELECT SCOPE_IDENTITY()
y luego usar el método ExecuteScalar en el objeto SqlCommand ...
var rowCount = command.ExecuteScalar()
Inmediatamente después de su inserción stmt , use
SELECT CAST(scope_identity() AS bigint) ---- incase you have a return result as int64
Esto devolverá la columna creada id/identity.
No use @@ IDENTITY, por simple que parezca. Puede devolver valores incorrectos.
SELECT SCOPE_IDENTITY()
parece ser la elección obvia.
Agregue un parámetro de salida al objeto de comando y luego establezca el valor en la nueva ID en el procedimiento almacenado.
procedimiento almacenado:
@ID AS INT OUTPUT
[Insert Command]
SET @ID = SCOPE_IDENTITY()
.NET:
cmd.CommandText = "stored_procedure";
SqlParameter pID = new SqlParameter("ID", DBType.Int32, 4);
pID.Direction = ParameterDirection.Output;
cmd.ExecuteScalar();
int id = Convert.ToInt32(cmd.Parameters["ID"].Value.ToString());
Aunque me gusta Dave Markle's respuesta, (y veo que tú también, ya que marcó como su respuesta) , ese método puede fallar si tiene activadores en su base de datos, que auditan las operaciones de CUD y su tabla de auditoría tiene una columna de IDENTIDAD. Devolvería el valor de la identidad de la tabla de auditoría, no la tabla en la que acaba de insertar, ya que la tabla de auditoría se realizó después.
En ese caso, se puede usar un método más genérico que funcionará en ambos casos, independientemente de cualquier auditoría. Es un poco más prolijo, pero obtienes lo que pagas.
ejemplo:
@"DECLARE @tmp AS TABLE (id int)
INSERT INTO case
(
caseID,
partID,
serialNumber,
hardware,
software,
firmware
)
OUTPUT Inserted.ID into @tmp
VALUES
(
@caseID,
@partItemID,
@serialNumber,
@hardware,
@software,
@firmware
)
Select ID from @tmp")
Scope_identity no fallará si tiene desencadenantes, será @@ identity el que fallará. – HLGEM
@Russ Su respuesta me ayudó cuando se trata de un error causado por desencadenantes de SyncFramework: 'La tabla de destino' dbo.table 'de la instrucción DML no puede tener activadores habilitados si la instrucción contiene una cláusula OUTPUT sin cláusula INTO'. Estoy usando un GUID para mi PK y no tengo una columna de IDENTIDAD. ¡Gracias! –
Si su id es un GUID, entonces me encontré con esta solución para ser mejor:
INSERT INTO YourTable (val1, val2, val3)
OUTPUT inserted.id
VALUES (@val1, @val2, @val3)
Gracias @ Scott Ivey
demostración completa:
internal static Guid InsertNote(Note note)
{
Guid id;
using (
var connection =
new SqlConnection(ConfigurationManager.ConnectionStrings["dbconn"].ConnectionString))
{
connection.Open();
using (
var command =
new SqlCommand(
"INSERT INTO Notes ([Title],[Text]) " +
"OUTPUT inserted.id " +
$"VALUES ('{title}','{text}');", connection))
{
command.CommandType = CommandType.Text;
var reader = command.ExecuteReader();
reader.Read();
id = reader.GetGuid(reader.GetOrdinal("id"));
}
connection.Close();
}
return id;
}
I would r recomendar un procedimiento almacenado, pero esto es para pruebas unitarias de nuestro repositorio.
¡Sí! Finalmente, después de buscar durante casi una hora, aparece una respuesta que muestra cómo obtener el valor de SALIDA en C# para un GUID. – Paul
- 1. Cómo insertar un registro con LINQ y C# y devolver la clave principal de ese registro
- 2. Validación ignorado cuando se clona un registro recién creado
- 3. Obteniendo la ID del registro recién insertado?
- 4. ¿Puedo devolver el campo 'id' después de insertar un LINQ?
- 5. ¿Cómo insertar un registro con solo valores predeterminados?
- 6. Tastypie obj_create - cómo usar un objeto recién creado?
- 7. Insertar id (autogenerado, solo columna)
- 8. Cómo devolver el ID de NHibernate ISession.SaveOrUpdate
- 9. ajuste de marco correcto de un recién creado CAShapeLayer
- 10. Mover el foco al registro recién agregado en un NSTableView
- 11. Insertar un registro con una clave compuesta con NHibernate
- 12. recién creado TFS 2010 iteración no visible
- 13. ¿Cómo encontrar un registro creado el mes anterior?
- 14. Cómo usar rawQuery para insertar un registro
- 15. Cómo insertar texto en un td con id, usando JavaScript
- 16. ¿Devuelve el ID de artículo de trabajo TFS recién creado utilizando la API TFS?
- 17. Registro de un objeto COM creado con VS C# 2010
- 18. Anular id en un objeto ruby (creado con OpenStruct)
- 19. Redireccionando con un 201 creado
- 20. ¿Es posible aplicar el comportamiento de solo lectura con SqlCommand?
- 21. ¿Puede PHP devolver un recurso con ID # 0?
- 22. ¿Cómo puedo insertar muchas filas en una tabla MySQL y devolver las nuevas ID?
- 23. Creando un método de recuperación genérico para devolver 1 registro
- 24. ASP.NET MVC Obtener ID del último registro agregado
- 25. Consulta SQL para devolver solo 1 registro por ID de grupo
- 26. ¿Cómo insertar un nuevo registro (modelo) en TreePanel?
- 27. ¿Cómo pasar múltiples argumentos a un proceso recién creado en C# .net?
- 28. Cómo insertar con un reverse_iterator
- 29. Adición de controlador de eventos al elemento recién creado
- 30. Android: ¿cómo anular el registro de un receptor creado en el manifiesto?
Si está utilizando un Guid, consulte mi respuesta. – Zymotik