@e1s

Как сформировать запрос к ms sql на основе xml файла?

Задача состоит в следующем - на основе xml и xsd файла необходимо создать БД в ms sql и засунуть туда информацию из xml файла (xml и xsd заранее не известны). Т.к. размер xml заранее не известен, то применять DataSet.ReadXml проблематично, вероятна ошибка нехватки памяти.

Самое оптимальное что удалось найти это использование XmlReader, но так как чтение идет последовательно сверху вниз, то тут возникает проблема в формировании запроса INSERT - идея в том что если в узле содержаться элементы со значениями и эти элементы одинакового уровня вложенности, то формируем запрос на вставку этих значений в таблицу с именем "родительского" элемента.
<a>
   <b>
      <c>val1</c>
      <d>val2</d>
   </b>
   <e>val3</e>
   <f>val4</f>
</a>


В данном случае необходимо в таблицу a вставить значения b e f, а в таблицу b значения c и d. Сама база данных сейчас создается на основе DataSet.ReadXmlSchema и потом для каждой DataTable я создаю таблицу в БД. Вот что удалось пока написать

while (xml.Read())
      {
       if (xml.NodeType.ToString() == "Element")
          {                    
              if (xml.IsEmptyElement != true)
                  {
                     myStack.Push(xml.Name);
                  }
          }
       else if (xml.NodeType.ToString() == "Text")
          {
              string first = myStack.Peek().ToString();
              myStack.Pop();
              string second = myStack.Peek().ToString();
              myStack.Push(first);
              Console.WriteLine("table {0} column {1} value {2}", second, first, xml.Value);
              string cmd = "INSERT INTO " + second + " (" + first + ") VALUES ('" + xml.Value + "')";
              SqlCommand command = new SqlCommand(cmd, conn);
              command.ExecuteNonQuery();
         }
     else if (xml.NodeType.ToString() == "EndElement")
         {
             myStack.Pop();
         }
     }


Но тут в одну строку только одно значение, что соответственно не правильно.
  • Вопрос задан
  • 1075 просмотров
Пригласить эксперта
Ответы на вопрос 1
ИМХО неопытного джуна, читать осторожно.

1) Работаем с LINQ to XML
2) Запросы LINQ to XML

В книге Джона Скита вроде читал про LINQ to XML и тонкости его работы, посмотрел, 3-е издание страница 380.
Участок памяти можно запросить у системы заранее.

Чтение XML и операции с БД лучше разделить, логировать ошибки не останавливая работу, нехватка памяти - докупить, или что то не правильно с архитектурой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы