Sql server 作用域标识似乎不适用于参数化查询
我有一个带有标识列的表,我希望在插入后获取其值。以下代码不使用参数,工作正常:Sql server 作用域标识似乎不适用于参数化查询,sql-server,ado.net,Sql Server,Ado.net,我有一个带有标识列的表,我希望在插入后获取其值。以下代码不使用参数,工作正常: 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
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();
如果我将上述代码的插入部分更改为使用参数化查询,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_标识码,以便它使用输出参数并调用ExecuteNonQuery()
,但在out参数中仍然得到空值。我还尝试过对两个不同版本的SQL Server(2012和2008,都是Express Edition)运行代码,同样得到了相同的结果
知道我做错了什么吗?尝试将插入和选择组合到一个语句中
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();
参数化查询可能会调用
sp\u executesql
。在子作用域中运行并且当它退出时,scope\u IDENTITY()
在外部作用域中为空。除了将它们组合到单个批处理中之外,另一个解决方法是停止在应用程序中嵌入动态SQL,并将此逻辑放入存储过程中。您还可以尝试将INSERT-into-aTable(…)输出Inserted.ID值(…)
自动输出所有插入的新ID
值。@MartinSmith谢谢,这很好地解释了为什么我接受的答案有效,而我的代码无效。对于像我这样的新手来说,这似乎令人惊讶,但加上Martin Smith的评论,这实际上是有意义的:-)无论如何,非常感谢!