2010-08-23 2 views
2

두 클래스 사이에 마스터 - 세부 관계가 있습니다. 마스터 클래스에는 많은 세부 정보 목록이 포함됩니다. 현재 사용 중이었습니다.datarows 목록을 사용하여 데이터 저장

public class Master: cloneable<T> 
{ 
    //other properties here... 
    private List<detailClass> details 
    public List<detailClass> Details 
    { 
     get { return details; } 
    } 
} 

마스터 클래스 내에 있습니다. 이 클래스를 저장하는 동안 SP로 전달하기 전에 세부 정보 목록의 데이터 테이블을 사용해야합니다. (이후 우리는 sql2008에서 테이블 값 매개 변수를 사용하고 있습니다). 이유는 tvp를 사용하는 이유는 1 마스터가 10k 세부 정보를 포함 할 수 있고 tvp는 db에 모든 정보를 매우 빠르게 덤프하는 매우 효율적인 방법입니다.

Q : 목록을 DB 삽입 용 데이터 테이블로 변환하면 동일한 데이터에 대한 이중 메모리 사용이 있습니다. 데이터 테이블을 직접 사용하는 것 외에 마스터에 세부 사항을 저장하는 더 좋은 방법이 있습니까?

Q : 다음 옵션은 List 세부 정보를 사용하고 datatable.ImportRow (row)를 수행하는 것입니다. 그러나 열을 정의하지 않고 행에 데이터를 추가하는 방법을 모르겠습니다. 또한 어떤 외부 객체가 그러한 목록의 개별 세부 필드를 어떻게 처리 할 수 ​​있는지 알지 못합니다. 나는 IEnumerable<SqldataRecord> 방법을 사용하고 스트리밍 및 memory.To의 추가 데이터 테이블과 유사한 솔루션을 찾고 다른 하나 도움이 될 만들지 않고도 데이터를 삽입 할 수 있었다 casperOne's answer 다음


, 내가 코드를 게시하고 이하.

public class DetailCollection: List<Detail>, IEnumerable<SqlDataRecord> 
{ 
    IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator() 
    { 
     // mapping the properties of the Detail object to the 
     // user defined table type in sql 
     SqlMetaData[] metaDataArray = new SqlMetaData[4]; 

     //-1 indicates varchar(max) sql data type 
     metaDataArray[0] = new SqlMetaData("Col1", SqlDbType.VarChar, -1); 
     metaDataArray[1] = new SqlMetaData("Col2", SqlDbType.TinyInt); 
     metaDataArray[2] = new SqlMetaData("Col3", SqlDbType.VarChar,100); 
     metaDataArray[3] = new SqlMetaData("Col4", SqlDbType.Int); 

     SqlDataRecord sdr = new SqlDataRecord(metaDataArray); 


     foreach (Detail detailRecord in this) 
     { 
        sdr.SetValue(0, detailRecord.Property1); 
        sdr.SetValue(1, Convert.ToByte(detailRecord.Property2)); 
        sdr.SetValue(2, detailRecord.Property3); 
        sdr.SetValue(3, detailRecord.Property4); 
        yield return sdr; 
     } 
    } 
} 

답변

1

당신은 두 가지 방법 중 하나를 사용하여 table-valued parameter에 결과를 스트리밍 할 수 있습니다 :

  • IEnumerable<SqlDataRecord> - 당신은 스트리밍 솔루션을 만들기 위해 (심지어 쉽게 LINQ를, 또는)을 IEnumerable<SqlDataRecord> 구현에 yield return을 사용할 수 있습니다 .
  • DbDataReader 구현 - 목록을 참조하고 독자가 열거 될 때 적절한 변환을 제공하는 구현을 만들 수 있습니다.

두 가지 중 하나를 사용하면 기본적으로 목록에서 항목을 가져 와서 결과를 표 값 매개 변수로 스트리밍하도록 변환하는 구현을 만들 수 있습니다. 이 방법으로 응용 프로그램에서 두 번째 목록을 다시 구체화 할 필요가 없으며 필요에 따라 첫 번째 목록에서 변환을 수행 할 수 있습니다.

자세한 내용은 MSDN의 "Table-Valued Parameters in SQL Server 2008"섹션, 특히 "SqlParameter 예제 구성"및 "DataReader를 사용하여 스트리밍 행"섹션을 참조하십시오.

관련 문제