Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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
C# 存储过程在ExecuteReader中究竟返回什么?_C#_Stored Procedures - Fatal编程技术网

C# 存储过程在ExecuteReader中究竟返回什么?

C# 存储过程在ExecuteReader中究竟返回什么?,c#,stored-procedures,C#,Stored Procedures,如果我有这样一个存储过程: ... set @query = N'select @total = count(*) from (...)'; exec sp_executesql @query @total output; return 现在在C代码中,我打开一个ExecuteReader,执行这个存储过程并开始读取,我实际上在读取什么?这是exec的结果还是return的结果?如果它来自exec,exec不是只是将变量total设置为某个值吗?为什么我代码中的ExecuteReader仍能

如果我有这样一个存储过程:

...
set @query = N'select @total = count(*) from (...)';
exec sp_executesql @query @total output;

return
现在在C代码中,我打开一个ExecuteReader,执行这个存储过程并开始读取,我实际上在读取什么?这是exec的结果还是return的结果?如果它来自exec,exec不是只是将变量total设置为某个值吗?为什么我代码中的ExecuteReader仍能正常读取行


我对ExecuteReader处理存储过程的方式非常困惑。

当然,output是一个关键字,它告诉存储过程在返回时输出变量应该是什么。

因为没有创建结果集,所以您将什么也看不到。您只需向变量赋值。

ExecuteReader读取查询返回的任何结果集。如果查询中有三个选择项,那么ExecuteReader将允许您访问所有三个结果集。您可以使用reader.NextResult在集合之间移动

如果您的查询包含对EXEC的调用,而EXEC又会生成一个结果集,那么使用EXEC调用的过程可能包含一个SELECT,那么ExecuteReader将读取该结果集

它与查询返回的结果集无关


有关更多信息:

Read的第一个调用将返回false。没有要读取的结果集。没有争吵。这就好像您执行了字符串,该字符串也不会返回任何内容,但它是一个有效的批处理。我的意思是,一般来说,它是从exec读取的吗?那么return做什么呢?Exec与结果集无关。选择可以生成结果集。它不向调用者返回集合,而是直接将行输送到客户端。过程不返回结果集,选择则返回结果集。选择的位置无关紧要。@Xufeng只生成顶级选择的结果集。嵌套选择称为派生表。它们不是语句,也不是独立存在的。因此,在我上面的代码中,如果我有另一个select in from,尽管它只是整个查询的一部分,但它仍然会生成一个结果集?如果您的意思是set@query=N'select@total=COUNT*from select*from Foo',则不会返回结果集,@total将被设置为SELECT的计数