У меня есть proplems с импортом 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
?
Я думаю, что это неправильно. Набор данных совсем другой, когда у меня есть некоторый корневой элемент вокруг элемента «Автомобили», а столбцы отсутствуют в таблицах Dataset. Он отлично работает без элемента root.
Обычно мне не нравится использовать DataSet
для импорта XML-данных в мою базу данных; класс DataSet
имеет очень специфический способ структурирования своих данных как XML и, наоборот, чтение другого XML.
Тем не менее, я предпочитаю WriteToServer
который принимает реализацию IDataReader
.
Вы можете легко создать метод расширения, который выполняет реализацию IEnumerable<T>
и сопоставляет его с IDataReader
; в основном, вы сопоставляете свойства класса с полями в таблице по имени и индексу, где индекс также является индексом в массив экземпляров Expression
(скомпилированных в lambdas), который вы создаете для T
который принимает экземпляр T
и возвращает значение свойства.
Обычно вы IDataReader.Read
реализацию IDataReader.Read
на метод IEnumerable<T>.MoveNext
.
После того, как у вас есть что-то подобное, вы можете сопоставить свой XML с легким объектом данных, который отражает таблицу, а затем передаст их последовательность в метод расширения, который отображает последовательность в реализацию IDataReader
.