2014-12-01 2 views
2

** 경고 - C#을 초보자 **데시벨 쿼리 - 실행이 자동으로 실패

내가 함께 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

거의 도움이되지 않습니다. Windows 서비스를 콘솔 응용 프로그램으로 실행하는 데 대한 유용한 자습서입니다. 그것은 당신에게 약간의 시간을 절약 할 것입니다. http://einaregilsson.com/run-windows-service-as-a-console-program/ – TheLittleHawk

+0

추가 참고 : MSSQL 서버 로그를 확인했지만 거기에 어떤 오류도 보이지 않았습니다 – Black

+1

구체적인 문제와 관련하여 내 머리 꼭대기에 해당 서비스가 데이터베이스에 액세스 할 수 없습니다. try/catch로 마무리 할 수 ​​있습니다. – TheLittleHawk

답변

1

의 실행 후 로그 문을 볼 수 없습니다 이유 :

  1. 코드에서 catch되지 않는 일부 데이터베이스 관련 예외가 발생하기 때문에 더 이상의 항목이 표시되지 않습니다. 정확한 오류는 # 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 년 전과 같이) 우리에게 엄청난 시간을 절약하고 응용 프로그램의 품질을 크게 향상 시켰습니다.

+0

이 질문/답변에서 많은 것을 배웠습니다. 서비스 코드에서 던져진 예외는 자동으로 어딘가에 끝날 것입니다. 예를 들어 이벤트 로그; @TheLittleHawk에 감사드립니다. – Black

관련 문제