使用c#从SQL Server Insert命令返回值
本文关键字:Insert 命令 返回值 Server SQL 使用 | 更新日期: 2023-09-27 18:25:04
在Visual Studio中使用C#,我将在一个表中插入一行,如下所示:
INSERT INTO foo (column_name)
VALUES ('bar')
我想做这样的事情,但我不知道正确的语法:
INSERT INTO foo (column_name)
VALUES ('bar')
RETURNING foo_id
这将从新插入的行返回foo_id
列。
此外,即使我找到了正确的语法,我也有另一个问题:我可以使用SqlDataReader
和SqlDataAdapter
。据我所知,前者用于读取数据,后者用于操纵数据。在插入带有return语句的行时,我同时在操作和读取数据,所以我不确定该使用什么。也许我应该用完全不同的东西来做这个?
SCOPE_IDENTITY返回插入同一范围内标识列的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批。因此,如果两个语句在同一存储过程、函数或批处理中,则它们在同一范围内。
您可以使用SqlCommand.ExecuteScaler执行插入命令并在一个查询中检索新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')
输出:
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());
}