Devuelve el valor del comando Insertar de SQL Server usando c #

Usando C # en Visual Studio, estoy insertando una fila en una tabla como esta:

INSERT INTO foo (column_name) VALUES ('bar') 

Quiero hacer algo como esto, pero no sé la syntax correcta:

 INSERT INTO foo (column_name) VALUES ('bar') RETURNING foo_id 

Esto devolvería la columna foo_id de la fila recién insertada.

Además, incluso si encuentro la syntax correcta para esto, tengo otro problema: tengo SqlDataReader y SqlDataAdapter a mi disposición. Hasta donde yo sé, el primero es para leer datos, el segundo es para manipular datos. Al insertar una fila con una statement de devolución, estoy manipulando y leyendo datos, así que no estoy seguro de qué usar. Tal vez hay algo completamente diferente que debería usar para esto?

SCOPE_IDENTITY devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito. Un scope es un módulo: un procedimiento almacenado, desencadenador, función o lote. Por lo tanto, dos instrucciones están en el mismo ámbito si están en el mismo procedimiento, función o lote almacenados.

Puede usar SqlCommand.ExecuteScalar para ejecutar el comando de inserción y recuperar el nuevo ID en una consulta.

 using (var con = new SqlConnection(ConnectionString)) { int newID; var cmd = "INSERT INTO foo (column_name)VALUES (@Value);SELECT CAST(scope_identity() AS int)"; using (var insertCommand = new SqlCommand(cmd, con)) { insertCommand.Parameters.AddWithValue("@Value", "bar"); con.Open(); newID = (int)insertCommand.ExecuteScalar(); } } 

prueba esto:

 INSERT INTO foo (column_name) OUTPUT INSERTED.column_name,column_name,... VALUES ('bar') 

OUTPUT puede devolver un conjunto de resultados (entre otras cosas), ver: cláusula OUTPUT (Transact-SQL) . Además, si inserta varios valores (INSERT SELECT), este método devolverá una fila por cada fila insertada, mientras que otros métodos solo devolverán información en la última fila.

ejemplo de trabajo:

 declare @YourTable table (YourID int identity(1,1), YourCol1 varchar(5)) INSERT INTO @YourTable (YourCol1) OUTPUT INSERTED.YourID VALUES ('Bar') 

SALIDA:

 YourID ----------- 1 (1 row(s) affected) 

Creo que puedes usar @@ IDENTITY para esto, pero creo que hay algunas reglas / restricciones especiales al respecto.

 using (var con = new SqlConnection("connection string")) { con.Open(); string query = "INSERT INTO table (column) VALUES (@value)"; var command = new SqlCommand(query, con); command.Parameters.Add("@value", value); command.ExecuteNonQuery(); command.Parameters.Clear(); command.CommandText = "SELECT @@IDENTITY"; int identity = Convert.ToInt32(command.ExecuteScalar()); }