我正在测试ExecuteScalar(),特别是它如何处理SP中的抛出错误。 执行具有此形状的SP时:
throw 50001, '', 1;
select 1;
ADO.NET引发异常(预期行为),但是,如果我执行具有此形状的SP:
select 1;
throw 50001, '', 1;
未引发异常(意外行为),我得到所选值(在这种情况下为1)。 我想这与Sql Server将其数据流回ADO.NET的方式有关,但我不知道如何解决这个问题。
答案 0 :(得分:1)
您未抛出异常的原因是因为ExecuteScalar()方法获取从命令或存储过程返回的第一个结果集,并丢弃任何其他结果。
这意味着在返回结果后引发异常时,您将永远不会使用ExecuteScalar()方法看到它,因为该方法已停止从数据库服务器查找结果集,并且基本上忽略了发回的任何其他信息。你可以看到这个,如果你返回2个值(即选择1;选择2;投掷;),因为第二个永远不会被看到。
如果您担心此行为,或者您可能希望从存储过程接收多个结果集,那么您应该使用ExecuteReader()来获取数据读取器,然后使用Reader对象的NextResult( )迭代返回的所有结果集的方法,然后你会看到异常被发送回你的程序。