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