2013-01-25 2 views
0

내 문제는 이것입니다. 나는 누군가를 귀찮게하기 전에 이것이 내 첫 번째 게시물이므로 잘못하면 용서해주십시오.파일보기 원격 사용자가 파일을 저장할 때 응용 프로그램이 작동하지 않습니다.

.txt 파일을 붙여 넣으면 콘솔 응용 프로그램을 트리거하는 파일 시스템 감시자를 사용하여 간단한 Windows 서비스를 만들었습니다. 이 서비스는 로컬 시스템으로 실행되며 완벽하게 작동합니다. 그러나 시계는 원격 사용자가 매일 아침마다 파일을 저장하므로 콘솔 응용 프로그램이 실패하지 않고 실패합니다. 파일을 저장하면 서비스와 콘솔 응용 프로그램이 정확히 수행 한 작업을 수행합니다.

콘솔 응용 프로그램은 GeneticParsing 라이브러리를 사용하여 파일을 테이블로 읽어 들여 원격 서버의 Oracle 11g db로 대량로드 한 다음 파일을 아카이브합니다. 콘솔 응용 프로그램의 주 코드는 아래에 있습니다 ... 어떤 도움을 많이 주시면 감사하겠습니다!

static void Main(string[] args) 
    { 
     try 
     { 
      FileInfo f = new FileInfo(args[0].ToString()); 

      Thread.Sleep(15000); 

      GenericParserAdapter p = new GenericParserAdapter(); 
      p.ColumnDelimiter = '|'; 
      p.SetDataSource(f.FullName); 
      DataTable d = new DataTable(); 
      d = p.GetDataTable(); 
      bb_usage_methods b = new bb_usage_methods(false); 
      DataTable d_merge = new DataTable(); 
      d_merge.Columns.Add("BB_USAGE_ID", Type.GetType("System.Int32")); 
      d_merge.Columns.Add("USAGE_DATE", Type.GetType("System.DateTime")); 
      d_merge.Columns.Add("PARTY_CODE", Type.GetType("System.Int32")); 
      d_merge.Columns.Add("UPLOAD_USAGE", Type.GetType("System.Decimal")); 
      d_merge.Columns.Add("DOWNLOAD_USAGE", Type.GetType("System.Decimal")); 
      d_merge.Columns.Add("TOTAL_USAGE", Type.GetType("System.Decimal")); 

      DataRow r; 
      object j = b.get_data_from_datareader("SELECT MAX(BB_USAGE_ID) FROM USAGE"); 
      Int32 max_id = j.ToString() == "Entry is NULL" || j.GetType() == System.Type.GetType("System.Exception") ? max_id = 1 : max_id = Convert.ToInt32(j) + 1; 

      for (int i = 0; i < d.Rows.Count; i++) 
      { 
       r = d.Rows[i]; 
       try 
       { 
        object[] o = { max_id, Convert.ToDateTime(r[0]), Convert.ToDecimal(r[1]), Convert.ToDecimal(r[2]), Convert.ToDecimal(r[3]), Convert.ToDecimal(r[4]) }; 
        d_merge.Rows.Add(o); 
        max_id++; 
       } 
       catch { } 
       r = null; 
      } 
      decimal original_count = Math.Round((decimal)(d.Rows.Count * 100)/d_merge.Rows.Count, 2); 
      b.bulk_insert_into_oracle(d_merge, "USAGE");     
      DateTime dt = f.LastWriteTime; 

      try 
      { 
       File.Move(f.FullName, f.FullName.Replace(f.Name, @"\..\Archive\" + f.Name)); 

      } 
      catch (Exception e) 
      { 
       // code to log error to db 
      } 
     } 

     catch (Exception ex) 
     { 
      // code to log error to db 
     } 
    } 
} 

public class log_methods : x.oracle_data_access 
{ 
    public log_methods() 
    { 
     base.get_dataset("SELECT * FROM APP_LOG", "LOG_ID"); 
    } 
} 

public class bb_usage_methods : x.oracle_data_access 
{ 
    public bb_usage_methods(Boolean get_dataset) 
    { 
     if (get_dataset) 
     { 
      base.get_dataset("SELECT * FROM USAGE", "BB_USAGE_ID"); 
     } 
    } 
} 

답변

0

파일 공유자가 해당 파일을 확인 했습니까? 원격 사용자가 프로그램을 저장하면 프로그램이 시작됩니다.

내가 기억한다면 파일 위처가 (원격 또는 기타 등)해야 할 때 트리거하지 않는 경우가 있습니다.

+0

그래, 위에서 여러 가지 단계에서 절차를 기록하는 코드를 생략했습니다. 시스템은 파서가 중지되기 전에 로그를 남깁니다. 문제는 파서가 프로그램을 계속 실행하는지, 프로그램이 더 이상 실행되지 않더라도 로깅이 DB에 커밋되지 않는지 알아낼 방법이 없다는 것입니다. – mustard