2012-09-25 6 views
1

xml 파일에 저장된 데이터를 가져와 linq-to-sql을 사용하여 Microsoft Access 데이터베이스로 보내는 파서를 만들었습니다. 나는 SQL 삽입 명령을 가지고 그들은 그들이 작동하지 않을 때까지 작동합니다.몇 초 후에 사라지는 sql의 "지정되지 않은 오류"

이상하게도 각 SQL 명령을 실행 (목록에 보관하고 각 명령을 한 번에 하나씩 실행)하고 처음 40 개는 "지정되지 않은 오류"가 발생할 때까지 정상적으로 실행됩니다. 문제는 내가 예외를 삼킨 다음 몇 초 후에 예외 포수가 계속 다시 시도하도록하면 다시 작업하기 시작한 것입니다. 즉, SQL 쿼리 자체의 오류 (또는 적어도 작성 방법)가 아닙니다.

이 패턴은 여러 번 반복됩니다 (수천 개의 삽입물이 있음). 정상적인 예외 처리를 수행하면 프로그램이 오류가 발생하는 동안 몇 가지 레코드를 건너 뛰고 일시적으로 원인이 무엇이든간에 삽입을 계속합니다. 나가 그것을 달리는 경우에 과정, 그것은 몇몇 기록을 삽입하고, 몇몇을 건너 뛴다, 삽입하고 건너 뛴다, 반복하고 최후에 기록의 2/3보다는 더 적은을 삽입한다.

내 컴퓨터가 40 분 정도만 실행되어 임의로 짧은 간격 동안 더 많은 실행을 거부하는 이유가 있습니까?

나는이 문제의 원인이 될 수있는 것을 놓치고 있습니다.

응용 프로그램이 기본적으로 실행됩니다. 어떤 서버/웹 통신도 사용하지 않으며 "지정되지 않은 오류"를 찾을 때 발견 한 모든 것은 ADO.NET 응용 프로그램에서 발생을 나타냅니다.

가 여기에 오류가 일어나는 코드입니다 :

public static string insertQuery(string sql) 
    { 
     string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\Owner\Desktop\Arbeit\TrademarkParserproject1\TrademarkParserproject\bin\x86\Debug\Database.accdb"; 
     OleDbConnection connection; 
     OleDbDataAdapter oledbAdapter = new OleDbDataAdapter(); 
     connection = new OleDbConnection(connetionString); 

     string success = "false"; 

     try 
     { 
      connection.Open(); 
      oledbAdapter.InsertCommand = new OleDbCommand(sql, connection); 
      oledbAdapter.InsertCommand.ExecuteNonQuery(); 

     } 

     catch (Exception ex) 
     { 
      success = ex.ToString(); 
      return success; 
     } 

     success = "true"; 
     return success; 
    } 

주, 나는 ACE.OLEDB.12.0 어댑터 오류를 방지하기 위해 X86 모드에서 실행되는 응용 프로그램이 있습니다.

답변

1

눈에 띄는 단점은 SqlConnection을 닫거나 처리하지 않는 것입니다. OleDbDataAdapter는 일회용이므로 삭제해야합니다. 'using'문은 다음과 같은 편리한 구조입니다.

public static string insertQuery(string sql) 
{ 
    string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\Owner\Desktop\Arbeit\TrademarkParserproject1\TrademarkParserproject\bin\x86\Debug\Database.accdb"; 
    using(var oledbAdapter = new OleDbDataAdapter()) 
    using(var connection = new OleDbConnection(connetionString)) 
    { 
     string success = "false"; 

     try 
     { 
      connection.Open(); 
      oledbAdapter.InsertCommand = new OleDbCommand(sql, connection); 
      oledbAdapter.InsertCommand.ExecuteNonQuery(); 
     } 

     catch (Exception ex) 
     { 
      success = ex.ToString(); 
      return success; 
     } 

     success = "true"; 
     return success; 
    } 
} 
+0

그게 전부입니다! 글리치는 처분하지 않고 너무 많은 동시 연결을 여는 결과 여야합니다. 고맙습니다!! – ConnorU

관련 문제