**警告 - c#newbie **
我试图拼凑查询MSSQL数据库的Windows服务。
我已创建基本服务并确认它可以写入事件日志。
我添加了一个ADO.NET实体数据模型,并从我的数据库元数据中生成了类。
在我的服务定期OnTimer方法中,我有以下代码:
public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
// TODO: Insert monitoring activities here.
eventLog1.WriteEntry("Monitoring the System 1", EventLogEntryType.Information, eventId++);
using (var db = new LcsCDREntities())
{
eventLog1.WriteEntry("about to query", EventLogEntryType.Information, eventId++);
var query = from c in db.ConferenceSessionDetailsViews
orderby c.SessionIdSeq
select c;
eventLog1.WriteEntry("there are " + query.Count().ToString(), EventLogEntryType.Information, eventId++);
foreach (var item in query)
{
eventLog1.WriteEntry("Conference data: " + item.SessionIdTime.ToString(), EventLogEntryType.Information, eventId++);
}
}
}
在事件日志中,我只看到"监控系统1"和"即将查询"。我从来没有看到" ...或"会议数据"。 我无法在调试器中运行我的代码,因为它是Windows服务,我依靠事件日志语句来确定执行停止的位置。我没有在事件日志中看到任何错误或异常,似乎执行在查询之前或之前停止。
请有人可以建议: 1.为什么我从来没有看到"关于查询"之后的日志语句 2.我怎么观察/调试这个过程的执行
答案 0 :(得分:2)
回答你的问题:
您永远不会看到任何进一步的条目,因为您的代码未捕获某些特定于数据库的异常。确切的错误必须通过#2的答案来确定。
确定发生了什么的方法是将整个方法包装在try / catch块中,并将异常消息(以及用于生产目的的堆栈跟踪)记录到事件日志中。如果您正在调试,可以在catch语句中设置断点,以确切了解发生的情况。
public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
try
{
// TODO: Insert monitoring activities here.
eventLog1.WriteEntry("Monitoring the System 1", EventLogEntryType.Information, eventId++);
using (var db = new LcsCDREntities())
{
eventLog1.WriteEntry("about to query", EventLogEntryType.Information, eventId++);
var query = from c in db.ConferenceSessionDetailsViews
orderby c.SessionIdSeq
select c;
eventLog1.WriteEntry("there are " + query.Count().ToString(), EventLogEntryType.Information, eventId++);
foreach (var item in query)
{
eventLog1.WriteEntry("Conference data: " + item.SessionIdTime.ToString(), EventLogEntryType.Information, eventId++);
}
}
}
catch (Exception ex)
{
eventLog1.WriteEntry("Exception: " + ex.Message, EventLogEntryType.Error);
}
}
我强烈建议您查看微软的Exception Handling Application Block。他们不仅在异常处理最佳实践方面拥有出色的指导,还包括可以直接进入您的应用程序的完全烘焙功能。
我们一直在使用这个块,因为它是在10年前首次推出的,它为我们节省了大量时间并大大提高了应用程序的质量。