2014-09-30 5 views
3

모든 System.Data.IDataRecordSqlDataReader에서 검색하고 싶습니다. LINQ를 사용하면 간단하지만 모든 SQL 개체를 삭제하고 데이터를 그대로 유지할 수 있기를 바랍니다.처분 후 SqlDataReader 레코드 사용

private static List<System.Data.IDataRecord> getRecords() 
{ 
    List<System.Data.IDataRecord> records; 
    //Make a SqlConnection and SqlCommand. 
    using (SqlDataReader reader = command.ExecuteReader()) 
    { 
     records = reader.Cast<System.Data.IDataRecord>().ToList(); 
    } 
    //Dispose of SqlCommand and SqlConnection. 
    return records; 
} 

을하지만, 여기에 내 질문은 다음과 같습니다 : getRecords()가 완료되면, 내 데이터를 가지고 있고, 모든 SQL 오브젝트가 배치 될 때까지 내가 물었다 아래는 내가 가지고있는 것입니다. 그러나 나는 자원 낭비를 막을 수있는 데이터에 매달리고 있습니까? 또는 일단 가비지 수집기가 작동하면 내 데이터가 무효화됩니까? 나는 대답이 '아니오'라고 생각하지만, 나는 결정적인 것을 찾기 위해 노력하고있다. 나는 Dispose()이 관리되지 않는 리소스 만 제거 할 것이라고 생각합니다. 그리고 목록에 데이터를 배치 했으므로 안전하다고 생각합니다. 감사.

답변

2

정상적으로 작동합니다.

IDataRecord 인스턴스는 어떤 식 으로든 SqlDataReader.Dispose의 영향을받지 않습니다. 그것들은 독자와 완전히 별개로 데이터와 스키마 정보의 완전한 복사본을 가지고 있습니다.

+0

예; 그들은 그 시점에서 단지 POCO로 간주 될 수 있습니다. –

+0

정말요? 나는 몇 년 전에 'IDataRecord'를 독자의 범위를 벗어난 곳에 놓아두고 문제를 일으키는 커다란 버그에 뛰어 들었다고 맹세 할 수있었습니다. 그 일이 있은 후에는 절대로 다시 시도하지 않았습니다. –

+0

@ScottChamberlain은 어디서나 문서에서 명시 적으로 보장되지 않기 때문에 ILspy를보고 확인했습니다. 어쩌면 그렇게 항상 그렇지 않을 수도 있습니다. –