2013-08-29 4 views
17

좋아, 내가 DataRowDataReader 밖으로 추출하고 싶습니다. 나는 꽤 많은 시간 동안 주변을 둘러 보았고, 이것을 할 수있는 간단한 방법이없는 것처럼 보입니다.DataReader의 현재 행에서 DataRow를 가져 오는 방법은 무엇입니까?

나는 DataReader이 더 많은 행 모음임을 이해하지만 그 때 한 행만 읽습니다.

그럼 내 질문 : DataRowDataReader의 현재 행을 추출하는 방법이 있습니까?

+1

에게, 단일 레코드에 대한 뷰와 같습니다. 'DataReader'는 데이터베이스의 레코드에 대한 전진 전용 스트림입니다. 현재 레코드 만 볼 수 있습니다. –

답변

23

DataReader의 현재 행에서 DataRow를 추출 할 수있는 방법이 있습니까?

아니요, 최소한 간단한 방법은 없습니다. 모든 DataRow는 Table에 속합니다. 이 속성을 비워 둘 수 없으며 ImportRow를 사용하지 않고 테이블을 변경할 수도 없습니다.

그러나 DataRows가 필요한 경우 먼저 DataTable을 채우지 않으시겠습니까?

DataTable table = new DataTable(); 
using(var con = new SqlConnection("....")) 
using(var da = new SqlDataAdapter("SELECT ... WHERE...", con)) 
    da.Fill(table); 
// now you have the row(s) 

당신이 정말로 당신이 컬럼에 대한 모든 정보를 얻을 수 reader.GetSchemaTable를 사용할 수있는 DataReader에서 행 (들)을 취득해야하는 경우 :

if (reader.HasRows) 
{ 
    DataTable schemaTable = reader.GetSchemaTable(); 
    DataTable data = new DataTable(); 
    foreach (DataRow row in schemaTable.Rows) 
    { 
     string colName = row.Field<string>("ColumnName"); 
     Type t = row.Field<Type>("DataType"); 
     data.Columns.Add(colName, t); 
    } 
    while (reader.Read()) 
    { 
     var newRow = data.Rows.Add(); 
     foreach (DataColumn col in data.Columns) 
     { 
      newRow[col.ColumnName] = reader[col.ColumnName]; 
     } 
    } 
} 

을하지만 그건 정말 효율적이지 않습니다.

+0

한 번에 하나의 행만 가져옵니다. 그래서 저는'DataReader'가'DataTable'을 채워서 다른'DataTable'의 다른 행과 병합하는 것보다 낫다는 것입니다. –

+0

당신의 편집은 멋진 관점을 가져옵니다. "DataTable"을 단일 행으로 채우고 이후에 병합하는 것보다 실제로 어떻게 더 좋아 보이지 않습니다. 내 질문에 정확히 답하지 않으면 답변 이벤트로 표시됩니다. –

+1

@im_a_noob : 이제 코드를 테스트하고 두 번째 부분을 편집했음을 유의하십시오. –

-2

그것은 여기에 분명 아니지만,

CType(reader, IDataRecord) 

는 다음과 같이 사용할 수 있습니다 단지 행 얻을 수 있도록 솔루션입니다 : 없음 _ "A DataReader를 더 행의 모음입니다"_

While reader.Read() 
    CType(reader, IDataRecord) 
End While