回答

收藏

SQL Server:使用原始异常号重新抛出异常

技术问答 技术问答 68 人阅读 | 0 人回复 | 2023-09-13

我在有两个INSERT指令的存储过程中使用TRY CATCH块。) @+ b4 I& S0 ^9 j% G4 L
如果出现问题,则CATCH块负责回滚所做的所有更改,并且除一件事外,它都可以正常工作!/ k$ R' J* O2 E
我的ASP.NET应用程序捕获的异常是一个SqlException,其编号为50000。这不是原始编号!(我期望的数字是2627)
! y% W6 K9 x# e/ Z; e8 F在异常的Message属性中,我可以看到原始的异常编号和格式化的消息。
' L4 P1 j! R9 F# \* u/ q8 P/ n我如何获得原始的异常编号?$ g  |# j6 m7 U0 v/ ?! m
try6 Z$ r4 V0 J" I* a
{
+ M3 I5 x' m7 M    // ... code8 {# @, @3 Z6 r8 E
}
0 b2 {6 ?0 X' Y2 Fcatch
( A: x4 F; c" d/ V(SqlException sqlException)2 R/ Q  W9 l6 F+ L; x3 ]$ W* e
{
' U. d2 V4 Z" c: T9 W1 B# A" ?    switch (sqlException.Number)7 x$ y. q3 Z! o4 o$ ?8 n' t
    {
3 Z- [" r; J3 {1 G        // Name already exists
, g! t6 p' f; |- B        case 2627:
0 ?3 q5 W6 M, A% N0 p2 H            throw new ItemTypeNameAlreadyExistsException();
5 i5 R) _1 G5 r4 I        // Some other error9 z' P% {* F% B) d" ~  @7 p8 |
        // As the exception number is 50000 it always ends here!!!!!!1 O! a+ p% G7 R
        default:4 [( F0 H' }& g/ G+ x
            throw new ItemTypeException();
( \. j+ T& A8 R    }
& |4 {, G3 |6 g+ |5 [* K) p0 A}5 a9 E! p9 ?2 r# |2 \' C) s) B
现在,返回值已被使用。我想我可以使用输出参数来获取异常号,但这是一个好主意吗?
! S* y$ L: Q+ e5 O% ]我该怎么办才能获得例外编号?谢谢
3 H/ `/ J" V4 n' f: Z+ ^; @PS:这是必需的,因为我有两个INSERT指令。: \6 \# O7 E& Q" \
               
" r$ m4 }9 z7 u9 x; T' K+ A- ?解决方案:& y* B6 P- s( h" f( {% E$ B
               
# A7 p% H) G& A. t) L4 a" s0 T
9 S% ^/ [% X; H6 J9 A' o6 r. |1 y! P) ]; P
                谢谢你们的回答。我已经做过一些事情,可以从重新抛出异常的信息中获取错误。0 v. ~* W2 j) `8 R0 ?5 m+ R) ~
@gbn我也喜欢gbn的答案,但是我会坚持这个答案,因为这是最有效的答案,我在这里发布它,希望它对其他人也有用。
! U$ z  w/ w. a) H答案是在应用程序中使用事务。5 M, |/ r, `+ |- R  J& U
如果在存储过程中未捕获到异常,则将在SqlException对象中获取原始编号。在应用程序中捕获原始异常之后,我编写以下代码
* f1 \, p0 P( m) ~4 d. `transaction.Rollback();
9 g. ]& {7 ^- y9 Z; l6 ]2 j) X5 d7 Z否则:
; L! ^4 P7 v& j7 |- M8 ~6 ltransaction.Commit();
+ L. O! f# |  |1 i# a, V! [5 U它比我最初预期的要简单得多!
4 k9 ?+ _  l$ n5 Q3 P/ u0 Ohttp://msdn.microsoft.com/zh-7 B- n; E! D8 ^2 u
CN/library/system.data.sqlclient.sqltransaction.aspx
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则