SCOPE_IDENTITY似乎不适用于参数化查询

时间:2012-09-27 13:27:49

标签: sql-server ado.net

我有一个带有标识列的表,我想在INSERT之后得到它的值。以下代码不使用参数,完美地运行:

string query = "INSERT INTO aTable ([aColumn]) VALUES (42)";
SqlCommand command = new SqlCommand(query, connection);
command.ExecuteNonQuery();

query = "SELECT CAST(SCOPE_IDENTITY() AS bigint)";
command = new SqlCommand(query, connection);
object identity = command.ExecuteScalar();

如果我更改上述代码的INSERT部分以使用参数化查询,ExecuteScalar()会突然返回System.DBNull值。这是参数化查询代码的样子:

string query = "INSERT INTO aTable ([aColumn]) VALUES (@aColumn)";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@aColumn", 42);
command.ExecuteNonQuery();

我试图更改SCOPE_IDENTITY代码,以便它使用输出参数并调用ExecuteNonQuery(),但我仍然在out参数中得到一个空值。我也试过针对两个不同版本的SQL Server(2012和2008,都是Express Edition)运行代码,同样的结果也是如此。

我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:6)

尝试将INSERT和SELECT组合成一个语句

string query = "INSERT INTO aTable ([aColumn]) VALUES (@aColumn);SELECT CAST(SCOPE_IDENTITY() AS bigint)"; 
SqlCommand command = new SqlCommand(query, connection); 
command.Parameters.AddWithValue("@aColumn", 42); 
object identity = command.ExecuteScalar();