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

Posted

技术标签:

【中文标题】使用 c# 从 SQL Server 插入命令返回值【英文标题】:Return value from SQL Server Insert command using c# 【发布时间】:2012-03-08 08:07:01 【问题描述】:

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

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

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

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

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

此外,即使我找到了正确的语法,我还有另一个问题:我可以使用SqlDataReaderSqlDataAdapter。据我所知,前者用于读取数据,后者用于操作数据。在插入带有 return 语句的行时,我既在操作又在读取数据,所以我不确定该使用什么。也许我应该为此使用完全不同的东西?

【问题讨论】:

【参考方案1】:

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

【讨论】:

蒂姆的好例子,对我帮助很大。感谢您发布像 Neko 这样的问题,正是我想要的! 让我在 sql 语句结束后发现错误字符【参考方案2】:

试试这个:

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

OUTPUT 可以返回结果集(除其他外),请参阅:OUTPUT Clause (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)

【讨论】:

这在桌子上有触发器时不起作用。在这种情况下,您将收到以下错误:The target table of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause. 不过,不确定它们对 without INTO clause 的含义,因为我的 INSERT 语句确实有一个 INTO 子句... @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`。【参考方案3】:

我认为您可以为此使用@@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());

【讨论】:

You should really use SCOPE_IDENTITY() and NOT @@IDENTITY - that might return surprisingly wrong results!

以上是关于使用 c# 从 SQL Server 插入命令返回值的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法将数据插入 SQL Server 数据库

在Sql中执行插入命令并返回插入的Id

在Sql中执行插入命令并返回插入的Id

C# SQL 插入到 Netezza。 Netezza 不发送返回,C# 代码超时

从 SQL Server 插入 Access

使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016