2009-12-02 2 views
3

OracleCommand.ExecuteNonQuery()를 사용하여 테이블에 삽입합니다. 모든 것이 잘 작동하지만 때로는 레코드가 삽입되지 않습니다. ExecuteNonQuery()가 레코드를 삽입하지 않고 예외를 throw하지 않을 수도 있습니다.ExecuteNonQuery가 삽입시 예외를 throw하지 않습니다.

저장 프로 시저를 사용하지 않습니다. 거래를 사용하고 있지 않습니다. ExecuteNonQuery()에 의해 throw 된 예외를 로깅하지만 분명히 예외가 throw되지 않습니다 ... 아니요 ExecuteNonQuery()의 반환 값을 확인합니다. 그러나 삽입이 성공하면 ExecuteNonQuery가 1보다 다른 값을 반환 할 가능성이 있습니까?

+0

코드의 트랜잭션 내에서이 작업이 수행되고 있습니까? 트랜잭션이 커밋되지 않았을 수 있습니다. –

+0

삽입되지 않은 이유는 흥미로울 것입니다 ... 또한 Insert-Statement를 게시 할 수도 있습니다. – Bobby

+0

몇 년 후 4.0 Oracle.DataAccess 구성 요소와 동일한 문제가 있습니다. ExecuteNonQuery는 오류가 발생해도 예외를 throw하지 않으며 해당 행 다음의 코드 실행을 중지합니다. –

답변

3

아니야. ExecuteNonQuery는 영향을받는 행 수를 나타내는 정수를 반환합니다. 삽입 된 행이 없으면 0을 리턴해야합니다. 쿼리를 실행하지 못하면 예외가 발생합니다. E.x .: 연결이 닫혀 있고, 테이블이 존재하지 않습니다.

+0

예외 검사가 (INSERT, UPDATE, DELETE) 작업의 오류를 파악하기에 충분하다는 내용의 문서가 있습니까? 반환 값을 무시하고 catch 문에만 의존 할 수 있습니까? 또한 MSDN 설명서에서 예외가 .NET 1.1에서 throw되지는 않았지만 그 예외는 .NET 2.0 이후에 발생해야합니다. – Nap

1

이것은 거의 없습니다.

더 높은 수준의 오류 처리기가있어 오류를 잡아 내고 버릴 수 있습니까? 이처럼 어딘가에 예외를 삼키는 경우가 아니라면

2

하지 :

try 
{ 
    DoSomethingOnTheDbThatMightThrowAnException(); 
} 
catch(Exception ex) 
{ 
    // Do nothing, thus swallowing the exception 
} 

을 또한, ExecuteNonQuery()의 반환 값을 확인합니다. 0 인 경우 직접 예외를 throw하는 것이 좋습니다.

1

"모든 것이 잘 작동하지만 때때로 레코드가 삽입되지 않습니다." 실제로 볼 수없는 레코드를 삽입 할 수있는 뷰로 /를 통해 삽입 할 수 있습니다. 가상 개인 데이터베이스/행 수준 보안도이 작업을 수행 할 수 있습니다.

0

기록에 대해서만이 문제가 발생했습니다.

셀에서 저장된 proc에 대한 명령 매개 변수를 작성할 때 행의 gridviewcell에서 null 또는 DBNull.Value를 테스트했기 때문에 발생했습니다. 이 같은

뭔가 :

if(cell.Value != DBNull.Value && cell.Value != null) 
{  
    //add the parameter to the Command object 
} 

이 내가 빈 문자열을 얻었고, Convert.ToDecimal 그 시간에 NumberFormatException이를 포기하지 않았다 때 매개 변수를 만드는 것을 의미했다.

대신 cmd.ExecuteNonQuery()를 실행하려고 할 때 NumberFormatException이 발생했습니다.

ExecuteNonQuery()가 시작될 때 런타임에 변환이 일어난다 고 생각합니다. 그것은 ExecuteNonQuery는()가 당신의 시도-catch 블록에 의해 체포되지 않은 예외가 발생하는 것이 될 수

if(cell.Value != DBNull.Value && 
!string.IsNullOrEmpty(cell.Value.ToString())) 
{ 
    //Create and Add the parameter 
} 
0

:

나는로 전환하여 고정. Windows 이벤트 로그를 확인하십시오. 드라이버 중 하나가 충돌하여 AccessViolationException이 발생할 수 있으며 일반적으로 .NET 4.0 이상에서 관리되는 코드에서 일종의 예외를 catch 할 수 없습니다. 해결책은이 link에 설명되어 있습니다.

관련 문제