2011-12-08 2 views
9

은 동일 함 DataReader가 [I]는 DataReader.GetValue DataReader.GetString (I) 대 (I) 대

dataReader.GetValue(i) 

논리적으로 동일

dataReader[i] 

인가? 그들은 다른가요? 하나가 다른 것보다 적절할 수있는 상황이 있습니까?

documented differently 있습니다

  • 지정된 인덱스
  • 반환 지정된 필드의 값에있는 열을 가져옵니다. 내가 그들을 사용할 때

은 그러나 둘은 필드의 값을 반환합니다. "기둥을 가져 오는 것"은 무엇을 의미합니까? "밭의 가치를 되 돌린다"는 것은 무엇을 의미합니까?


보너스 채팅 : 내가 전화

:

reader[i]; 
reader.GetValue(i); 
reader.GetString(i); 

나는 String

답변

15

은 궁극적으로 당신이 언급하는 System.Data.IDataReader의 특정 구현에 따라 각각의 시간을 얻을 , 그러나 당신이 System.Data.SqlClient.SqlDataReader을 의미한다고 가정합시다. 이 경우

, reader[i]reader.GetValue(i) 정확히 같은 일 을한다. 실제로 reader[i]은 내부적으로 reader.GetValue(i)으로 전화합니다. (ILSpy 같은 도구를 사용하여 코드를 분해하면이 사실을 알 수 있습니다.) 이 두 멤버는 현재 행의 i 번째 열의 값을 반환하며 값의 유형에 관계없이 반환합니다 (반환 유형은 object 임). 이 두 구성원의 설명서는 약간 오도 된 내용이며 더 나은 방법으로 말 할 수 있습니다. 당신이 좋아하는 곳이라면이 두 멤버 중 하나를 사용할 수 있습니다.

반면에 reader.GetString(i)은 현재 행의 i 번째 열에 포함 된 값을 string으로 반환하도록 특별히 설계되었습니다. 해당 열의 값이 string이 아닌 경우 InvalidCastException이 발생합니다. 값이 string이고 작업 할 형식이 string이면이 방법을 사용하십시오. 이렇게하면 캐스트를 수행 할 필요가 없으므로 코드가 간결 해집니다.

특정 경우 현재 행의 i 번째 열에있는 값은 string이어야하며 세 가지 구성원 모두의 반환 값이 동일해야합니다.

정확하게 쓰여진 경우 System.Data.IDataReader의 다른 구현은 같은 방식으로 동작해야합니다.

+0

'GetValue'가'바이트 '를 반환하지만 끔찍한 경우가 있습니다.하지만 GetInt32는 바이트를 Int32로 캐스트 할 수 없습니다 –

+0

(특히 분해 된 코드는 읽기가 어렵 기 때문에) 말하기 어렵지만 열의 값이 이미 원하는 유형이어야합니다. 그렇지 않으면 InvalidCastException (자체가 약간 잘못된 것입니다)이 발생합니다. 나는 대답을 편집 할 것이다. –

+0

실제로 GetInt32 (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getint32.aspx)에 대한 설명서는 "변환이 수행되지 않으므로 검색된 데이터는 이미 32 비트 부호있는 정수 여야합니다. " 다른 GetXXX 메서드도 비슷하게 문서화됩니다. –