c #windows服务中的db查询 - 执行无提示失败

时间:2014-12-01 01:31:39

标签: c# sql-server visual-studio

**警告 - 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.我怎么观察/调试这个过程的执行

1 个答案:

答案 0 :(得分:2)

回答你的问题:

  1. 您永远不会看到任何进一步的条目,因为您的代码未捕获某些特定于数据库的异常。确切的错误必须通过#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);
        }
    }
    
  3. 我强烈建议您查看微软的Exception Handling Application Block。他们不仅在异常处理最佳实践方面拥有出色的指导,还包括可以直接进入您的应用程序的完全烘焙功能。

    我们一直在使用这个块,因为它是在10年前首次推出的,它为我们节省了大量时间并大大提高了应用程序的质量。