2011-10-27 3 views
1

SqlBulkCopy을 사용하여 XML 파일을 가져 오는 중 프로 플럼을 사용하고 있습니다.SqlBulkCopy - XML ​​데이터를 SQL 테이블로 가져 오기

내 표는 다음과 같습니다
<root> 
    <Automobiles> 
     <Car Id="1" Name="SomeModel1"/> 
     <Car Id="2" Name="SomeModel2"/> 
     <Car Id="3" Name="SomeModel2"/> 
    </Automobiles> 
    </root> 

: 여기

Int   Id 
varchar Name 

내 코드입니다 : XML 파일은 다음과 같습니다

DataSet ds = new DataSet(); 
ds.ReadXml(Server.MapPath("autolist.xml")); 

SqlConnection connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["Connection"].ToString()); 
SqlBulkCopy sbc = new SqlBulkCopy(connection); 
sbc.DestinationTableName = "Automobiles"; 

foreach (DataColumn dc in ds.Tables[0].Columns) 
{ 
    sbc.ColumnMappings.Add(dc.Caption, dc.Caption); 
} 

connection.Open(); 

sbc.WriteToServer(ds.Tables[0]); 

connection.Close(); 

이 난 단지는 아니지만 때문에 Id의 이름을 가져올 수의 속성과 DataSet에는 하나의 열만 포함됩니다. 속성을 열에 매핑하는 방법이 있습니까?

DataSet 대신 XmlDocument을 사용하는 것이 더 좋을까요?

내가 잘못 생각합니다. 데이터 세트는 Automobiles 요소 주위에 몇 가지 루트 요소가 있고 데이터 세트 테이블에 열이 없으면 상당히 다릅니다. 그것은 루트 요소없이 잘 작동합니다.

+1

코드를 가져 오려고 시도했지만 문제가 될 수 없도록 DateSet에 2 열 (ID 및 이름)이 있습니다. 매핑에 문제가 생길 수 있습니까? –

+0

의견을 주셔서 감사합니다. 내 매핑을 확인하겠습니다 – ilkin

답변

3

일반적으로 DataSet을 사용하여 XML 데이터를 데이터베이스로 가져 오는 것을 좋아하지 않습니다. DataSet 클래스에는 데이터를 XML로 구조화하고 반대로 다른 XML을 읽는 매우 구체적인 방법이 있습니다.

즉, IDataReader 구현을 사용하는 WriteToServer overload이라고합니다.

IEnumerable<T> 구현을 사용하는 확장 메서드를 쉽게 만들고 쉽게 IDataReader에 매핑 할 수 있습니다. 기본적으로 클래스의 속성을 이름 및 색인을 기준으로 테이블의 필드에 매핑합니다. 에 대해 생성 한 Expression 인스턴스 (람다로 컴파일 됨)의 배열에 대한 인덱스 인 색인은 T의 인스턴스를 반환합니다. 프로퍼티 치

일반적으로 IDataReader.Read 구현을 IEnumerable<T>.MoveNext 방법으로 매핑합니다.

이 작업을 마치면 XML을 테이블을 미러링 한 빛의 데이터 객체에 매핑 한 다음 시퀀스를 IDataReader 구현에 매핑하는 확장 메소드에 전달할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 당신의 대답 후에 어떤 연구를했고 som 예제를 발견했다. – ilkin