2009-10-16 3 views
1

내가 널 체크를하고있는 중이 야하지만 할 때 나는 밖으로 범위 예외의 인덱스를 얻고있다 :데이터 표시기에 특정 열이 없을 수 있는지 확인하려면 어떻게해야합니까?

if(myReader["column1"] != null) 
{ 

} 

을 열이 존재하지 않습니다 특정 조건에서, 왜 작업 NULL 체크하지?

+0

왜 열입니다 "거기가 아니라"이 "

나는 가장 좋은 일이 같은 GetSchemaTable() 함수 그러나"롤 - 네 - 자신의 "DoesColumnExist 스타일 기능, 뭔가를 사용하는 것입니다 생각 특정 시간에? – Achilles

답변

1

쿼리가 반환하는 열을 변경하는 이유는 무엇입니까? 열의 이름에 해당하는 열 색인이 없기 때문에 열 이름을 사용하여 열을 참조하면 예외가 발생합니다. 내가 당신이라면 예외를 포착하고 이에 따라 오류를 처리 할 것입니다. 같은 쿼리가 물건에 따라 다른 열을 반환하는 경우

if (myReader.GetSchemaTable().Columns.Contains("ColumnName")) 
{ 

} 
1

을 존재하는 경우

2

시도 할 수 있습니다 볼 수 있습니다 나에게 아주 좋은 디자인 같지 않아. 어쨌든, 당신은 오른쪽 컬럼을 가지고 있는지 아닌지를 확인하기 위해 다른 컬럼에 myReader.GetName (i)을 사용할 수 있습니다.

0

: 열이

for(int i = 0; i < myReader.FieldCount; i++) 
    if (myReader.GetName(i) == "column1") 
     return true; 

0

글쎄, DataReaderGetSchemaTable()을 노출하며 DataReader 안에 스키마/열을 표시합니다.

또 다른 대안은 단지 열에서 값을 잡아 그 결과 예외를 잡으려고 시도, 즉 열이 존재하지 않아야

try 
{ 
    object value = dataReader["ColumnName"]; 
    // Do something with the value... 
} 
catch(IndexOutOfRangeException e) 
{ 
    // Column not there! 
} 

을 그러나, 나는 예외는 잡기/던지는으로이 조언을하지 않을 값 비싼 비즈니스이므로 코드 내에 예외적으로이 발생해야합니다.

public bool DoesColumnExist(IDataReader reader, string columnName) 
{ 
    reader.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '" + columnName + "'"; 
    return (reader.GetSchemaTable().DefaultView.Count > 0); 
} 
관련 문제