2013-12-09 1 views
0

Я создал ниже код, чтобы получить пользователей из XML:Как вставить IEnumerable <XElement> объект в таблицу SQL Server?

 string userName = "user"; 
     string password = "password"; 
     string uri = @"uri"; 
     WebClient webClient = new WebClient(); 
     webClient.Credentials = new NetworkCredential(userName, password); 
     Stream stream = webClient.OpenRead(uri); 
     XElement output = XElement.Load(stream); 
     IEnumerable<XElement> users = from el in output.Elements() select el; 

     foreach (XElement str in users) 
     { 
      Console.WriteLine(str); 
     } 

Результат:

 <User> 
      <ObjectId>3cbde</ObjectId> 
      <Alias>alias</Alias> 
      <DisplayName>Display Name</DisplayName> 
      <TimeZone>0</TimeZone> 
      <Language>0</Language> 
      <ListInDirectory>false</ListInDirectory> 
      <IsVmEnrolled>true</IsVmEnrolled> 
     </User> 

Теперь я хотел бы, чтобы вставить данные в базу данных, но я хотел бы поставить каждое поле как отдельный столбец - таблица в базе данных имеет столбцы: ObjectId, DISPLAYNAME, TimeZone и т.д. могли бы вы дать мне несколько советов, как это можно легко сделать? Нужно ли преобразовать его в DataTable или иначе?

+0

Нет никаких оснований писать 'from x in y select x' – SLaks

+0

@SLaks Я новичок в Linq :) Не могли бы вы направить меня на правильную страницу? – ironcurtain

+0

http://msdn.microsoft.com/en-us/library/bb397926.aspx – SLaks

ответ

1

В этом примере я беру XML-поток локально, для целей тестирования. Просто измените его на свой метод получения потока (WebClient). Также используется SqlBulkCopy, я не вижу недостатков в этом, плюс, если у вас будет много строк для вставки, это будет быстрее. Есть, вероятно, более эффективные способы, чтобы реорганизовать, но примерно:

 SqlBulkCopy bulkCopy = new SqlBulkCopy("ConnectionString..."); 
     bulkCopy.DestinationTableName = "PhysicalTableName"; 
     DataTable dt = new DataTable("PhysicalTableName"); 


     dt.Columns.Add("ObjectId"); 
     dt.Columns.Add("Alias"); 
     dt.Columns.Add("DisplayName"); 
     dt.Columns.Add("TimeZone"); 
     dt.Columns.Add("Language"); 
     dt.Columns.Add("ListInDirectory"); 
     dt.Columns.Add("IsVmEnrolled"); 


     XElement output = XElement.Load("c:\\temp\\input.xml"); 
     IEnumerable<XElement> users = output.Elements(); 

     foreach (XElement str in users) 
     { 
      DataRow dr = dt.NewRow(); 
      foreach (XElement node in str.Elements()) 
      { 
       dr[node.Name.LocalName] = node.Value; 
      } 

      dt.Rows.Add(dr); 
     } 

     bulkCopy.WriteToServer(dt); 

У меня не было никакой информации о схеме таблиц так что по умолчанию в этом примере, все столбцы типа String.

Не забывайте также об обработке исключений.

+1

Благодарим вас за ответ. Я думаю, что быстрее будет использовать сборку в хранимой процедуре MSSQL sp_xml_preparedocument, а затем использовать Select * из OpenXML. – ironcurtain

 Смежные вопросы

  • Нет связанных вопросов^_^