2012-03-15 6 views
5

나는이 SQL 문 실행되는 코드의 다음 비트 :는 SQL 오류를 감지 할 수

int rowsEffected = 0; 
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString)) 
{ 
    try 
    { 
     dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage); 
     dbConnection.FireInfoMessageEventOnUserErrors = true; 

     dbConnection.Open(); 


     SqlCommand command = dbConnection.CreateCommand(); 
     command.CommandTimeout = 0; 
     command.CommandText = sqlStatement; 

     rowsEffected = command.ExecuteNonQuery(); 
    } 
    catch (Exception e) 
    { 
     // Handle exception 
    } 
} 

긴 실행중인 SQL 문이 함께 RAISERROR를 사용하여 오류를 제기하여 SqlInfoMessageEventHandler를 통해 진행 상황을보고 할 수 있습니다 적절한 심각도 값.

FireInfoMessageEventOnUserErrors를 true로 설정하는 이유는 SQL 문에서 모든 메시지가 ExecuteNonQuery()가 반환 될 때 한꺼번에 처리되기 때문입니다. 이 값을 true로 설정하면 진행 메시지가 SQL 문에 의해 처리 될 때 처리됩니다.

속성의 이름에서 알 수 있듯이 이벤트 핸들러는 SQL 문에 의한 진행 피드백에 대해 예약 된 특정 심각도 수준뿐만 아니라 오류시에도 발생합니다. 당신이 볼 수 있듯이 오류가 'E'만 예외를 던지는 것은 아무것도하지 않는 내에서 속성에 의해 발생하는 경우

public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
{ 
    if (e.Errors.Count > 0) 
    { 
     throw new Exception("Something bad happened"); 
    } 

    // Report progress 
} 

, 나는 감지 할 수 있습니다 :

진행 피드백을위한 이벤트 핸들러는 다음과 같습니다 . 실행이 catch 블록으로 떨어지길 바랬지 만, 그렇지 않습니다.

ExcecuteNonQuery() 메서드 다음에 오류가 발생했는지 어떻게 확인할 수 있습니까?

TIA

+0

스레드에서 코드를 실행하고 그 함수에서 thread.abort를 호출 할 수 있습니다. – SamFisher83

+1

+1 : 나는 그것을 읽는 것으로부터 뭔가를 배울 수있는 질문을 좋아합니다. – NotMe

답변

3

나는이 문제를 해결할 수있었습니다. 이벤트 처리기가 포함 된 클래스에 속성을 추가했습니다. 오류가 발생하면 ExcecuteNonQuery()를 호출 한 다음 읽을 수있는 오류 플래그 속성을 해당 클래스에 보냈습니다. 오류가 발생하면 정리 코드를 작성할 수 있습니다. 답장을 보내 주셔서 감사합니다.

+0

대답으로 대답 표시하십시오 – Marcin

+0

비슷한 일을해야했지만 외부 스레드가 DB Command 개체에 액세스해야하는 상황에서 마지막으로 SQL 호출을 차단하는 데 사용 된 SQL 호출을 저장하여 잠재적으로 확인하거나 취소 할 수있었습니다. 다른 스레드. – Brain2000

1

사용 SqlException 클래스 대신 Exception 클래스입니다. 그리고 나서 다음을 살펴보십시오. e.Errors

+0

답변 해 주셔서 감사합니다. 나는 실제로 Exception을 사용하지 않고, custom Exception을 사용하고 있지만, 이것을 Exception으로 변경 한 샘플 코드만을 위해서. ExcecuteNonQuery()를 호출하는 코드에서 e.Errors에 액세스 할 수 없습니다. – millie