刚刚发现了一个简单的错误,这引发了一个有趣的问题。环境:VS 2010,.NET 4,C#。从 SQL 存储过程中获取返回值时出现了“指定的转换无效”异常:
cm.Parameters.Add( "@si", SqlDbType.SmallInt ).Direction= ParameterDirection.ReturnValue;
..
cm.ExecuteNonQuery( );
short siRetVal= (short) cm.Parameters[0].Value; // exception here
由于代码在调试模式下运行并在那一行中断,我在即时窗口中输入了以下内容:
?(short) cm.Parameters[0].Value
结果是:
Cannot unbox 'cm.Parameters[0].Value' as a 'short'
这个SQL存储过程返回一个32位的 int
(不是我最初以为的16位的 short
),这解释了异常。应该为这个参数使用正确的宽度-毫无疑问。
但是有人能解释一下为什么只有在立即窗口中才报告错误的根本原因吗?在异常助手中没有详细信息公开,内部异常为空。知道确切的原因不是很有益吗?我认为这会使错误分析更加简单,不是吗?
编辑: 添加了屏幕截图;堆栈跟踪似乎没有暗示任何ADO.NET代码(我没有期望)。更有甚者,如果我将返回值参数“声明”为SmallInt
,但提供一个适当宽度的变量(或像所示的转换),容纳一个int
,则一切正常!我相当肯定这与ADO/SQL无关。
我相信Hans Passant揭示了这里发生的真实情况,并倾向于接受他的解答。尽管发现托管代码甚至不能为我提供有关执行状态的准确详细信息(例如,哪个参考实际上为空-如上所述或在这种情况下无效转换)有些令人失望。