从SQL Server返回值使用c#插入命令

在Visual Studio中使用C#,我将一行插入到这样的表中:

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

我想要做这样的事情,但我不知道正确的语法:

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

这将从新插入的行返回foo_id列。

此外,即使我find正确的语法,我有另一个问题:我有SqlDataReaderSqlDataAdapter在我的处置。 据我所知,前者是用来读取数据的,其次是用来处理数据的。 当用return语句插入一行时,我既操作又读取数据,所以我不确定要使用什么。 也许我应该用完全不同的东西呢?

SCOPE_IDENTITY返回插入同一范围内的标识列的最后一个标识值。 范围是一个模块:存储过程,触发器,函数或批处理。 因此,如果两个语句处于相同的存储过程,函数或批处理中,则它们在相同的范围内。

您可以使用SqlCommand.ExecuteScalar执行插入命令并在一个查询中检索新的ID。

 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(); } } 

尝试这个:

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

OUTPUT可以返回结果集(除其他外),请参阅: OUTPUT子句(Transact-SQL) 。 另外,如果插入多个值(INSERT SELECT),则此方法将为每个插入的行返回一行,其他方法将只返回最后一行的信息。

工作示例:

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

OUTPUT:

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

我认为你可以使用@@ IDENTITY,但是我认为它有一些特殊的规则/限制吗?

 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()); }