두 클래스 사이에 마스터 - 세부 관계가 있습니다. 마스터 클래스에는 많은 세부 정보 목록이 포함됩니다. 현재 사용 중이었습니다.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;
}
}
}