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

Nek*_*eko 23 c# sql-server ado.net insert return-value

在Visual Studio中使用C#,我在表中插入一行,如下所示:

INSERT INTO foo (column_name)
VALUES ('bar')
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO foo (column_name)
VALUES ('bar')
RETURNING foo_id
Run Code Online (Sandbox Code Playgroud)

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

此外,即使我找到了正确的语法,我还有另外一个问题:我有SqlDataReader并且SqlDataAdapter随意使用.据我所知,前者用于读取数据,第二个用于操作数据.当使用return语句插入一行时,我正在操作和读取数据,因此我不确定要使用什么.也许我应该用这个完全不同的东西?

Tim*_*ter 63

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

您可以使用SqlCommand.ExecuteScalar执行insert命令并在一个查询中检索新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();
    }
}
Run Code Online (Sandbox Code Playgroud)


KM.*_*KM. 13

试试这个:

INSERT INTO foo (column_name)
OUTPUT INSERTED.column_name,column_name,...
VALUES ('bar')
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

YourID
-----------
1

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

  • @Louis Somers,只是一个普通的`OUTPUT`子句将返回一个结果集.如果添加"INTO",它将被插入表中.创建一个表变量:`DECLARE @Temp table(xyz int,abc varchar(5))`你可以将`OUTPUT`行放到这个表中,然后在'INSERT`之后你可以`SELECT``` @ Temp`表返回结果集.使用类似这样的东西:`OUTPUT INSERTED.col1,INSERTED.col2 INTO @ Temp`然后在'INSERT`之后:`; SELECT*FROM @ Temp`. (2认同)