Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 作用域标识似乎不适用于参数化查询_Sql Server_Ado.net - Fatal编程技术网

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的评论,这实际上是有意义的:-)无论如何,非常感谢!