SqlBulkCopy - XML ​​데이터를 SQL 테이블로 가져 오기

.net dataset sqlbulkcopy xml xmldocument

문제

나는 SqlBulkCopy 사용하여 XML 파일을 가져 오는 것으로 proplems를 가지고있다. XML 파일은 다음과 같습니다.

   <root>
    <Automobiles>
        <Car Id="1" Name="SomeModel1"/>
        <Car Id="2" Name="SomeModel2"/>
        <Car Id="3" Name="SomeModel2"/>
    </Automobiles>
   </root>

내 테이블은 다음과 같습니다.

Int         Id
varchar    Name

여기 내 코드가 있습니다 :

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();

IdId 가져올 수 있지만 Name과 DataSet 에는 하나의 열만 있기 때문에 Name은 가져올 수 없습니다. 속성을 열에 매핑하는 방법이 있습니까?

DataSet 대신 XmlDocument 를 사용하는 것이 좋습니다.

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

수락 된 답변

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

즉, IDataReader 구현을 사용하는 WriteToServer 오버로드 를 선호합니다.

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

일반적으로 IDataReader.Read 구현을 IEnumerable<T>.MoveNext 메서드에 IEnumerable<T>.MoveNext 합니다.

이와 같은 것을 얻은 후에는 XML을 테이블을 미러링 한 lightwieght 데이터 객체에 매핑 한 다음 시퀀스를 IDataReader 구현에 매핑하는 확장 메소드에 전달할 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.