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

her*_*ube 2 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();
Run Code Online (Sandbox Code Playgroud)

如果我更改上面代码的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();
Run Code Online (Sandbox Code Playgroud)

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

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

pod*_*ska 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(); 
Run Code Online (Sandbox Code Playgroud)