2008-10-07 5 views
2

모든 사람들이 자신의 데이터베이스에서 결과를 처리하는 가장 좋은 방법은 무엇이라고 생각하는지 궁금합니다. 다른 팀이 참여할 수 있으며 절차/데이터가 변경 될 수있는 기회가 항상 있으며 잘못된 결과가 발생할 수 있습니다. 내 질문은 이것이다. 보류 및 예외 발생, catch 및 기록 또는 모든 우발 사건을 처리하고 오류 숨기기가 더 좋습니까? 다음과 같이 말하십시오.데이터베이스 소급 데이터베이스 반환 데이터

if (dr.Table.Columns.Contains("column") && !dr["column"].Equals(DBNull.Value)) 
{ 
    this.value = (type)dr["column"]; 
} 
else 
{ 
    this.value= null; 
} 
+0

이 질문은 실제로 데이터베이스와 관련이 없습니다. 동일한 것은 서비스 또는 dll 호출에 대해 말할 수 있습니다 ...정말 일반적인 예외 처리 문제입니다. –

답변

4

개인적으로 나는 적절하게 사과하는 사용자 메시지를 사용하여 빠르게 실패합니다. 복구 할 가치가있는 몇 가지 사항이 있지만 널이 아닌 것으로 예상되는 열과 같은 것이 널 귀하게 들리게합니다.

물론, 나는 또한 당신이 생산 :

0

데이터베이스 제약 당신이 대부분의주의를 복용해야하기 전에 대해 알고 있는지 확인하기 위해 약간의 연기 테스트를 설정하려고 것입니다. 그렇지 않은 경우 db 디자인으로 돌아가서 이러한 제약 조건을 수정하는 것이 좋습니다.

실패하면 해당 필드에서 예외를 반환하면 데이터를 고정 (또는 제거) 할 수 있으므로 가장 좋습니다.

0

"불가능한"것이 발생하면 처리하고 예외를 잡을만한 가치가있는 모든 것을 다루십시오.

@AviewAnew에 의하면, 당신은 아마도 약간의 편집증 환자일지도 모르지만, 그것이 당신이 틀렸다는 것을 의미하지는 않습니다!

필자는 누락 된 열이 null 값보다 훨씬 나쁠 것이라고 생각했을 것입니다. 누락 된 열에 대해서는 예외를 던지면됩니다. 당신이 당신의 코드를 통해이 모든 검사를 가하고 할 거라면 다른 한편으로

try // wrap everything in a try/catch to handle things I haven't thought of 
{ 

    if (!dr.Table.Columns.Contains("column")) 
    { 
     throw new SomeSortOfException("cloumn: " + column + " is missing"); 
    } 
    else // strictly don't need the else but it makes the code easier to follow 
    { 
     if (dr["column"].Equals(DBNull.Value)) 
     { 
      this.value= null; 
     } 
     else 
     { 
      this.value = (type) dr["column"]; 
     } 
    } 
} 
catch(SomeSortOfException ex) 
{ 
    throw; 
} 
catch(Exception ex) 
{ 
    // handle or throw impossible exceptions here 
} 

는 ..., 유지 보수 오버 헤드가 상당 할 것입니다. ... 고려해야 할 또 다른 것입니다.

전화하세요!

0

나는 처음부터 그런 일이 일어날 수 없다는 것을 확인하고 가능한 한 최소화 할 수 있도록 노력할 것입니다.

예를 들어 jonSkeet의 게시물에서. 열에 대해 null이 아닌 조건을 예상하면 해당 열에 제약 조건이 있습니까? 그렇지 않다면 DBA/DB 개발자가 그런 식으로 말했기 때문에 아마 기대할 수 있습니다. 나는 당신이 그 사실에 의지하고 그들을 격려하고, 자극하고, 비공개 제약 조건을 추가하도록 당부 할 것이라고 말하고 싶습니다. 고유 한 값이 필요하다고 생각되면 고유 한 제한 조건을 요청하십시오. 대문자 만 검사 제약 조건을 추가하십시오. 코드가 모두 대문자인지, 다음 앱인지, 다음 앱인지, 한 번만 수행 될 수있는 다음 앱인지는 거의 감지 할 수 없습니다. DRY를 기억하십시오 - 반복하지 마십시오.

누락 된 열 오류에 대한 나의 적극적인 접근 방식은 응용 프로그램에서 사용하는 테이블 및 뷰와 절차에 대한 db 개발 팀의 이해를 확인하는 것입니다. 각 응용 프로그램마다 고유 한 사용자 이름이 있어야하며 각 응용 프로그램의 사용자 이름은 필요한 테이블에서만 선택되어야합니다 (은 보안 기능으로, 그러나 문서로는이 아님). 이 표를 변경하면이 앱에서 사용됩니다. procs와 동일하게, 그것을 사용하는 앱에 실행을 허가한다. 이 정도를 유지하고 "변경시 외부 종속성을 확인하십시오"라고 표명하면 태도로 인해 많은 오류가 발생합니다.