3

我有一个带有标识列的表,我想在 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 版)运行代码,再次得到相同的结果。

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

4

1 回答 1

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(); 
于 2012-09-27T13:30:05.220 回答