SqlBulkCopy - импорт данных XML в таблицу SQL - PullRequest
1 голос
/ 27 октября 2011

У меня проблемы с импортом XML-файла с использованием SqlBulkCopy.Файл 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();

Я мог только импортироватьId но не Name, потому что его атрибут и DataSet содержат только один столбец.Есть ли способ сопоставить атрибуты столбцам?

Может быть, лучше использовать XmlDocument вместо DataSet?

Я думаю, что не так.Набор данных сильно отличается, когда у меня есть некоторый корневой элемент вокруг элемента Automobiles, а в таблицах набора данных отсутствуют столбцы.Хорошо работает без корневого элемента.

1 Ответ

3 голосов
/ 27 октября 2011

Обычно я не люблю использовать DataSet для импорта данных XML в мою базу данных; DataSet класс имеет очень специфический способ структурирования своих данных в виде XML и, наоборот, чтения другого XML.

Тем не менее, я предпочитаю вызывать перегрузку WriteToServer , которая принимает реализацию IDataReader.

Вы можете легко создать метод расширения, который принимает реализацию IEnumerable<T> и сопоставляет его с IDataReader; в основном вы отображаете свойства класса в поля таблицы по имени и индексу, где индекс также является индексом в массиве Expression экземпляров (скомпилированных в лямбда-выражения), которые вы создаете для T, который принимает экземпляр T и возвращает значение свойства.

Обычно вы сопоставляете реализацию IDataReader.Read с методом IEnumerable<T>.MoveNext.

Как только у вас будет что-то подобное, вы можете отобразить ваш XML на облегченный объект данных, который отражает таблицу, и затем передать их последовательность в метод расширения, который отображает последовательность в реализацию IDataReader.

...