Trace the sql print message in .net code

本文介绍如何在SQL存储过程中打印消息并利用C#代码调用这些存储过程,以便在数据库迁移后继续跟踪打印消息,帮助解决潜在的bug。
The scenario is we usually print some message in the sql PROCEDURE to help us debug the PROCEDURE, but some time once we delopy the database we still want to trace the print message from the sql PROCEDURE to help us debug some bugs. This article will give a intrudce to implemented this scenarios.
1. First we create a sql procedure for test
Create PROCEDURE dbo.TestPrintMessage
as
Print 'Warning: This is a warning message test'
Print 'Error: This is a error message '
Print 'Critical: This is critical message'
Print 'Verbose: This is verbose message'
Print 'Information: This is information message'
select 'test'
2. Use the C# code to call the sql procedure and trace these pring messages
SqlConnection sqlCon = new SqlConnection("Data Source=.;Initial Catalog=AdventureWorks;Integrated Security=True");
sqlCon.InfoMessage +=
new SqlInfoMessageEventHandler(OnReceivingInfoMessageFromSql);
SqlCommand cmd = new SqlCommand("dbo.TestPrintMessage");
cmd.CommandType =
CommandType.StoredProcedure;

cmd.ExecuteNonQuery();

3. Code for OnReceivingInfoMessageFromSql
/// <summary>
/// The event handler for the InfoMessage event.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The event arguments.</param>
private static void OnReceivingInfoMessageFromSql(object sender, SqlInfoMessageEventArgs e)
{
string prevLogMessage = String.Empty;
Regex traceLevelPattern = new Regex(@"^(Warning|Error|Critical|Verbose|Information):",RegexOptions.IgnoreCase);
TraceSource tracer = new TraceSource("DBLayer");
foreach (SqlError err in e.Errors)
{
string errMessage = err.Message;
string logMessage = errMessage;
TraceEventType level = TraceEventType.Verbose;
Match m = traceLevelPattern.Match(errMessage);
if (m.Success)
{
try
{
level = (TraceEventType)Enum.Parse(
typeof(TraceEventType), m.Result("$1"));
}
catch (ArgumentException ae)
{
tracer.TraceEvent(
TraceEventType.Warning,
0,
"Unexpected failure to parse the message trace event type. {0}",
ae.ToString());
}
logMessage = errMessage.Substring(m.Result("$1:").Length);
}
if (prevLogMessage != logMessage)
{
tracer.TraceEvent(level,0," {0}@{1}: {2}",err.Procedure,err.LineNumber,logMessage);
prevLogMessage = logMessage;
}
}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值