2013-08-05 2 views
-8

이 코드가 작동하지 않는 이유는 무엇입니까? foreach에 try catch를 넣었을 때와 같이 잘 작동합니다. 이유를 알아야 해. 도와주세요.foreach 루프에서 잡으려고 시도하는 것이 좋습니다.

try 
{ 
    mySqlConnection = new SqlConnection(); 
    mySqlConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["connectionstring"].ToString(); 

    mySqlCommand = new SqlCommand("spSocialGetUniqueWords", mySqlConnection); 

    foreach (KeyValuePair<string, int> pair in url) 
    { 
     mySqlCommand.Parameters.Add(
     new SqlParameter("@uniqueKeyWords", pair.Key)); 

     mySqlCommand.Parameters.Add(
     new SqlParameter("@counts", pair.Value)); 

     mySqlCommand.CommandType = CommandType.StoredProcedure; 
     mySqlCommand.Connection.Open(); 
     count = mySqlCommand.ExecuteNonQuery(); 
     mySqlCommand.Connection.Close();   
    }     
} 
catch (Exception ex) 
{     
} 
+7

"작동하지 않음"을 정의 하시겠습니까? –

+3

예외 처리하지 않고 캐치를 시도하지 마십시오. NEVER NEVER NEVER 로그에 예외를 작성하십시오. 그리고 뭐가 잘못되었는지 확인하십시오 – Nahum

+1

나는 예외가 있다고 가정합니다. * catch * 블록에 중단 점을 넣으십시오. 또는 더 나은 - 예외 (로그, 사용자에게 보여주기 등)를 처리하십시오. –

답변

8

그것은 작동하지 않습니다, 그 다음은 failling되어 있지만 Exception을 사로 잡고있다하지만 아무것도 안하고, 한 번 실행됩니다. 코드의 문제점은 중복 매개 변수를 추가한다는 것입니다. 각 루프가 끝난 후 지워야합니다.

+1

아니면 루프에 들어가기 전에 매개 변수를 정의하십시오. 루프 내부에서만 값을 변경합니다 (매개 변수 수집을 지우고 다시 작성할 필요가 없음) – Steve

+0

정교하게 사용할 수 있습니까? –

0

대부분의 경우 루프의 첫 번째 반복에서 오류가 발생합니다.

try/catch 블록이 루프 외부에 있기 때문에 전체 루프가 실행을 중지하는 반면 루프에 넣으면 첫 번째 반복에 오류가 있고 두 번째 반복에 오류가 포함되어 있으면 코드에서 계속 시도하고 두 번째 반복을 실행하십시오.

이 코드는 잠재적 인 오류를 가정하는 것은 당신이 매개 변수를 삭제하지 않는 것입니다,하지만 더 잘 작동 할 수

: 나는에 Close를 호출 할 필요가 없습니다 블록을 사용하여 사용하도록 코드를 리팩토링 한

using (mySqlConnection = new SqlConnection()) 
{ 
    mySqlConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["connectionstring"].ToString(); 

    using (mySqlCommand = new SqlCommand("spSocialGetUniqueWords", mySqlConnection)) 
    { 
     mySqlCommand.CommandType = CommandType.StoredProcedure; 

     mySqlConnection.Open(); 

     foreach (KeyValuePair<string, int> pair in url) 
     { 
      mySqlCommand.Parameters.Clear(); 

      mySqlCommand.Parameters.Add(
       new SqlParameter("@uniqueKeyWords", pair.Key)); 

      mySqlCommand.Parameters.Add(
       new SqlParameter("@counts", pair.Value)); 

      count = mySqlCommand.ExecuteNonQuery(); 
     } 
    } 
} 

연결 객체는 코드 실행이 using 블록을 종료 할 때이를 적절하게 처리합니다.

또한 새 매개 변수 컬렉션을 추가하기 전에 매개 변수 컬렉션을 지우고 일부 속성 setter를 개체의 인스턴스화에 더 가까이 옮기고 (다른 것들에 의존하지 않으므로) SqlConnection.Open() 호출을 foreach 루프 외부로 이동했습니다. 리소스 및 실행 시간을 절약 할 수 있습니다. 또한 성능에 심각한 영향을 미칠 수있는 연결로 SQL Server를 잠식하지 않는데도 도움이됩니다.

관련 문제