2013-03-12 3 views
-1

나는이 코드를보고 있어요 :ExecuteScalar 결과를 확인하는 가장 효율적인 방법은 무엇입니까?

object objvalid = cmd.ExecuteScalar(); 
//made it this far - must not have thrown an exception 
retVal = true; 

을 ...하지만 이들 중 하나가 더있을 생각입니다 :

Int32 anybodyThere = (Int32) cmd.ExecuteScalar(); 
retVal = anybodyThere > 0; 
+1

먼저 'ExecuteScalar for exist'를 정의하십시오. 어떤 SQL을 사용하고 있습니까? 어떤 값을 선택합니까? 무엇을 확인하고 싶니? 숫자 값 (예 :'COUNT')을 반환하고 0보다 큰지 알고 싶으면 확인하십시오. 그런 다음 마지막 접근 방식이 좋습니다. 그것이 'null'을 반환 할 수 있다면 두 번째 접근 방식이 더 적절합니다. –

+0

내가 의미 한 바는 값을 반환할까요? 이 코드는이 SQL이있는 "IsValidField()"메서드에서 가져온 것입니다. string.Format ("SELECT {0} FROM {1}", fieldName, tableName); –

+0

@ClayShannon 그럼 테이블에 열이 있는지 효율적으로 확인하고 싶습니까? –

답변

1

...

object objvalid = cmd.ExecuteScalar(); 
retVal = (null != objvalid); 

난 당신이 대답 생각 너 자신의 질문. 당신은 그러나이

object objvalid = cmd.ExecuteScalar(); 
retVal = (null != objvalid); 

보다 훨씬 더 얻을 수 없다, 당신의 의견에서, 그것은 열 이름이 테이블에 존재하는지 알고 무엇을 당신이 정말로 원하는 것 같다. 이를 위해 DbDataAdapter.FillSchema 또는 DbConnection.GetSchema을 사용하는 것이 좋습니다. 두 옵션을 사용하면 모든 열에 대해 데이터베이스를 다시 쿼리하지 않고 모든 열에 대해 데이터베이스에 대해 단일 쿼리를 실행할 수 있습니다.

+0

이 방법은 자주 호출되지 않습니다. 단지 사용자의 데이터베이스 사본에 파란색 달에 한 번 새로 추가 된 열이 있는지 확인하기 만하면됩니다 (반복해서 호출되는 것은 아닙니다). –

+0

@ClayShannon 충분합니다. :) –

1

첫 번째 방법은 효율성 측면에서 측정 가능한 차이를 만들지 않으며,이 경우에는 관련이 없습니다.

무엇을 확인 하시겠습니까?

  • null을 반환 할 수 있고이를 알고 싶으면 확인하십시오. 그럼 두 번째 목표가 최고입니다.
  • 쿼리에서 숫자 값 (예 : COUNT)을 반환하고 이것이 0보다 큰지 알고 싶다면 바로 확인하십시오. 그런 다음 마지막 접근 방식이 좋습니다.

그러나 정상적인 제어 흐름에서는 처음에 접근 방법이 바람직하지 않습니다. don't rely on exceptions.

관련 문제