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

时间:2012-02-16 21:43:11

标签: c# sql-server ado.net insert return-value

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

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

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

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

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

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

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:13)

试试这个:

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)

答案 2 :(得分:-1)

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