2011-11-29 4 views
0
private DataRow getDataRowFromReader(IDataReader reader) 
{ 
    DataRow row = new DataRow(); 
    DataTable tbl = new DataTable(); 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     Type type = reader[i].GetType(); 
     if(type.Equals(Type.GetType("DBNull")) || type.Equals(Type.GetType("System.DBNull"))) 
      type = typeof(string); 
     DataColumn col = new DataColumn(reader.GetName(i), type); 
     tbl.Columns.Add(col); 
    } 
    row = tbl.NewRow(); 
    for (int i = 0; i < reader.FieldCount; i++) 
    { 
     Type readerType = reader[i].GetType(); 
     Type rowType = row[i].GetType(); 
     if (readerType.Equals(rowType)) 
      row[i] = reader.GetValue(i); 
     else 
      row[i] = reader.GetString(i); 
    } 
    return row; 
} 

1 루프에서 DBNull을 처리하려고하는데 두 번째에는 DBNull 유형의 NewRow()에 의해 작성된 모든 행이 있습니다.DataRow 유형은 DBNull입니다.

rowType ~ DBNull

왜 이런 일이 발생합니까?

+0

달성하려는 목표는 무엇입니까? – abatishchev

+3

DataReader를 사용하는 [DataTable의 Load 메서드] (http://msdn.microsoft.com/en-us/library/7x8ccbsb.aspx)를 인수로 사용하지 않는 이유는 무엇입니까? 'DataTable dt = 새로운 DataTable(); dt.Load (reader); ' –

답변

1
당신은 당신이보고있는 값이 DBNull이인지 확인하려면이 옵션을 사용할 수 있습니다

:

reader.IsDBNull(i) 

당신이 시도에있어 컬럼의 유형을 찾으려면

http://msdn.microsoft.com/en-us/library/system.data.idatarecord.isdbnull.aspx를 참조하십시오

reader.GetFieldType(i) 

http://msdn.microsoft.com/en-us/library/system.data.idatarecord.getfieldtype.aspx

은 또한, 나는이 생각을 참조 첫 번째 루프 이후에 row = tbl.NewRow()을 수행하여 해당 참조를 포기하는 경우 첫 번째 라인에 new DataRow()을 사용할 필요가 없습니다.

2

Convert.IsDBNull(reader[i])을 사용하십시오.

GetType() 결과를 문자열과 비교하는 것은 끔찍합니다.

+3

또는 단지'reader.IsDBNull (i)' –