从SQL Server 2000错误中检索错误文本

时间:2008-09-24 16:22:53

标签: asp.net sql-server error-handling

我需要帮助在SQL Server 2000中记录来自T-SQL的错误。我们需要记录陷阱中的错误,但是却无法获得我们原本坐在SQL Server Management Studio前面的相同信息。

我可以得到一条没有任何参数替换的消息:

SELECT MSG.description from master.dbo.sysmessages MSG
INNER JOIN sys.syslanguages LANG ON MSG.msglangID=LANG.msglangid
WHERE MSG.error=@err AND LANG.langid=@@LANGID

但我没有找到任何找出错误参数的方法。我想看看:

表MYTABLE7上的约束违规MYCONSTRAINT2

表%s上的约束违规%s

谷歌搜索只使用需要管理员访问权限且不适合生产代码的DBCC OUTPUTBUFFER来发现外来方案。如何获取带参数替换的错误消息?

4 个答案:

答案 0 :(得分:2)

在.Net中,从sql server检索错误消息(以及从 print raiserror 输出的任何内容)就像在SqlConnection上设置一个属性一样简单( .FireInfoMessageEventOnUserErrors = True )并处理连接的InfoMessage事件。 .Net收到的数据与您在SQL Server Management Studio结果网格中的 Messages 窗口中获得的数据相匹配。

所有代码都在处理事件的函数中,你可以对它进行抽象,以便所有连接指向同一个方法,因此除了两行代码之外,除了应用程序的其余部分之外没有其他任何内容可以更改当您创建新连接以设置属性和事件时(并且您已将其抽象出去,因此您只需要在一个地方进行,对吧?

以下是我认为definitive error guide for SQL Server的链接 http://www.sommarskog.se/error-handling-I.html

在某些情况下,即使发生错误,SQL Server也会继续处理。请参阅上一个链接中标有 What Happens when an Error Occurs? 的标题。

答案 1 :(得分:1)

查看Raiserror在线图书(描述)

您会发现语法如下所示:

RAISERROR ( { msg_id | msg_str } { , severity , state } 
    [ , argument [ ,...n ] ] ) 
    [ WITH option [ ,...n ] ] 

,错误参数如下:

d or I Signed integer 
o Unsigned octal 
p Pointer 
s String 
u Unsigned integer 
x or X Unsigned hexadecimal 

VB以后的任何语言都能够捕获这些语言并让你采取适当的行动。

Dave J

答案 2 :(得分:0)

您很快就会升级到SQL2005吗?如果是这样,你可以利用他们的TRY / CATCH模型更轻松地完成你想要做的事情。

catch中暴露的变量可以为您提供抛出错误的对象,行号,错误消息,严重性等。从那里,您可以记录它,发送电子邮件等。

答案 3 :(得分:0)

FORMATMESSAGE(它也存在于SQL Server 2000中)允许您从上面的sysmessages模板中将消息构建为最终格式。

然而,RAISERROR命令(几乎是数据库引擎本身在发生错误时内部调用的内容)已经发送了可以被捕获并记录在客户端中的已完成文本。 SSMS是一个客户端,不会生成自己的消息:所有消息都来自数据库引擎。

但是,我收集你想要使用T-SQL记录T-SQL错误。坦率地说,你不能在SQL Server 2000上。太多错误是批量和范围中止以可靠地记录任何东西。

您必须在SQL Server 2005上使用TRY / CATCH / ERROR_MESSAGE,或者在客户端中陷阱,然后使用log4net之类的东西重新登录到SQL Server。