2012-11-16 4 views
0

나는 다음과 같은 코드가 있습니다SQLDataReader는 첫 번째 요소를 표시하지 않지만 액세스합니다.

SqlDataReader sdr = null; 
. 
. 
sdr = cmd.ExecuteReader(); 

while(sdr.Read()){ 
    string x = sdr["x"].ToString(); 
    Console.WriteLine(x); 
    long? y = Int64.Parse(sdr["y"].ToString()); 
} 

을와 y의 값을 구문 분석 할 때 나는 현재 문제를 디버깅하고있다. 데이터베이스에서 콘솔에 쓰여진 값 x에 대해 y는 숫자 값이라고 말합니다 (그렇지 않은 경우 null입니다).

예외가 발생하면 sdr을 가리키고 저장되는 실제 데이터로 이동합니다. 요소 [0]의 값은 화면에 방금 작성된 값 x에 해당합니다. 다시 말해, x가 표시되는 올바른 값을 볼 수 있기 때문에 x가 확실히 액세스됩니다. 그러나 Visual Studio 2008에서 디버깅 할 때 객체의 메모리를 보면 첫 번째 요소에는 콘솔에 방금 표시된 것과 같은 x-column 값이 없습니다!

- 액세스 된 요소를 볼 수없는 이유는 무엇입니까? -이 문제는 내 숫자 값이 올바르게 파싱되지 않는다는 사실과 관련이 있습니까?

다른 이상한 점을 발견했습니다. Visual Studio에서 sdr 개체를 처음 볼 때 요소를 볼 수 있습니다. 마우스를 화면의 다른면으로 이동시킨 다음 객체 위로 마우스를 가져 가면 sdr 판독기 객체의 요소를 반복하려고 시도합니다. 요소가없는 것처럼 보입니다.

+0

나는'string x = sdr [ "x"];'컴파일을합니다. 문자열 변수를 선언하고 개체를 할당합니다 (datareader의 [** 인덱서 **] (http://msdn.microsoft.com/en-us/library/f01t4cfy.aspx)는 항상 개체를 반환합니다). –

+0

@TimSchmelter vb.net? – mezamorphic

+0

(내 마지막 코멘트 편집) VB.NET에서는'OPTION STRICT off'를 설정할 수 있습니다 (권장하지 않음). 그런 다음 문자열에 객체를 할당 할 수 있습니다. 하지만 C#에서는 컴파일되지 않습니다. –

답변

0

정말 그

당신이 SqlDataReader 개체의 값에 액세스하고 변환하기 전에 DBNull.Value 확인하는 코드를 작성해야 @TimSchmelter에 의해 언급 된 컴파일 문제를 따로 두는 ... SqlDataReader 개체로 작업하는 방법이 아니다

string x = string.Empty; 
int index = sdr.GetOrdinal("x"); 
if (!sdr.IsDBNull(index)) 
    x = sdr.GetString(index); 

long? y; 
index = sdr.GetOrdinal("y"); 
if (!sdr.IsDBNull(index)) 
    y = sdr.GetInt64(index); 
관련 문제