Asp.net 从SQL Server 2000错误中检索错误文本
我需要帮助记录SQL Server 2000中T-SQL的错误。我们需要记录捕获到的错误,但在获取与坐在SQLServerManagementStudio前面相同的信息时遇到了困难 我可以在没有任何参数替换的情况下获得消息,如下所示:Asp.net 从SQL Server 2000错误中检索错误文本,asp.net,sql-server,error-handling,Asp.net,Sql Server,Error Handling,我需要帮助记录SQL Server 2000中T-SQL的错误。我们需要记录捕获到的错误,但在获取与坐在SQLServerManagementStudio前面相同的信息时遇到了困难 我可以在没有任何参数替换的情况下获得消息,如下所示: SELECT MSG.description from master.dbo.sysmessages MSG INNER JOIN sys.syslanguages LANG ON MSG.msglangID=LANG.msglangid WHERE MSG.er
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
RAISERROR ( { msg_id | msg_str } { , severity , state }
[ , argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
但是我没有找到任何方法来找出错误参数。我想看看:
表MYTABLE7上的约束冲突MYCONSTRAINT2
不是
表%s上的约束冲突%s
谷歌只发现了使用DBCC OUTPUTBUFFER的奇特方案,这些方案需要管理员访问权限,不适用于生产代码。如何使用参数替换获得错误消息?是否有可能很快升级到SQL2005?如果是这样,您可能会利用他们的TRY/CATCH模型来更轻松地完成您要做的事情
catch中暴露的变量可以为您提供抛出错误的对象、行号、错误消息、严重性等。从那里,您可以记录它、发送电子邮件等。您有可能很快升级到SQL2005吗?如果是这样,您可能会利用他们的TRY/CATCH模型来更轻松地完成您要做的事情
catch中公开的变量可以为您提供抛出错误的对象、行号、错误消息、严重性等。从那里,您可以记录错误、发送电子邮件等。在.Net中,从sql server检索错误消息(以及从print或raiserror输出的任何内容)非常简单,只需在SqlConnection上设置一个属性即可(.FireInfoMessageEventOnUserErrors=True)并处理连接的InfoMessage事件。由.Net接收的数据与您在SQL Server Management Studio结果网格的Messages窗口中获得的数据匹配 所有的代码都在处理事件的函数中,您可以将其抽象,以便所有连接都指向同一个方法,这样,在创建新连接以设置属性和事件时,除了两行代码之外,应用程序的其余部分就没有什么可更改的了(你已经把它抽象了,所以你只需要在一个地方做,对吗?) 这是我认为的一个链接。
在某些情况下,即使发生错误,SQL Server仍将继续处理。请参阅上一链接中标记的标题。在.Net中,从SQL Server检索错误消息(以及从print或raiserror输出的任何内容)非常简单,只需在SqlConnection上设置一个属性即可(.FireInfoMessageEventOnUserErrors=True)和处理连接的InfoMessage事件。由.Net接收的数据与您在SQLServerManagementStudio结果网格的Messages窗口中获得的数据相匹配 所有的代码都在处理事件的函数中,您可以将其抽象,以便所有连接都指向同一个方法,这样,在创建新连接以设置属性和事件时,除了两行代码之外,应用程序的其余部分就没有什么可更改的了(你已经把它抽象了,所以你只需要在一个地方做,对吗?) 这是我认为的一个链接。
在某些情况下,即使发生错误,SQL Server仍将继续处理。请参阅上一链接中标记的标题。在联机丛书中查找错误(已描述) 您会发现语法如下所示:
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
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在线查册查找错误(已描述) 您会发现语法如下所示:
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
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(它也存在于SQL Server 2000中)允许您从上面的sysmessages模板将消息构建为最终格式
但是,RAISERROR命令(这几乎是数据库引擎本身在发生错误时内部调用的命令)已经发送完成的文本,这些文本可以捕获并记录在客户端中。SSMS是客户端,不会生成自己的消息:所有消息都来自数据库引擎
但是,我猜想您希望使用T-SQL记录T-SQL错误。坦率地说,您不能在SQL Server 2000上记录。太多的错误是批处理和范围中止,无法可靠地记录任何内容
您必须在SQL Server 2005上才能使用TRY/CATCH/ERROR_MESSAGE,或者在客户机中设置陷阱,然后使用类似于log4net的东西重新登录到SQL Server。(它也存在于SQL Server 2000中)允许您从上述系统消息模板将消息构建为最终格式
但是,RAISERROR命令(这几乎是数据库引擎本身在发生错误时内部调用的命令)已经发送完成的文本,这些文本可以捕获并记录在客户端中。SSMS是客户端,不会生成自己的消息:所有消息都来自数据库引擎
但是,我猜想您希望使用T-SQL记录T-SQL错误。坦率地说,您不能在SQL Server 2000上记录。太多的错误是批处理和范围中止,无法可靠地记录任何内容
您必须在SQL Server 2005上才能使用TRY/CATCH/ERROR_消息,或者在客户端设置陷阱,然后使用类似log4net的东西重新登录SQL Server。我希望他们升级到2005!这是我的第一选择,但不在我的控制范围内。我希望他们升级到2005!这是我的第一选择,但不在我的控制范围内。客户端系统在异常情况下,错误消息会显示出来吗?在任何情况下,我仍然希望从TSQL 1中这样做,这将是应用程序重构错误处理的一个主要返工。和2,在程序中间有一个错误需要记录,但错误是不存在的。