2012-06-27 2 views
1

Я пишу программу, которая собирает множество отдельных фрагментов данных из базы данных MySQL и сериализует эти данные в XML-документ.Какой самый аккуратный способ сбора большого количества данных в .Net

В моем документе XML есть пять основных групп, каждая из которых содержит 3 подгруппы, и я собираю около 100 фрагментов данных.

Информация о контенте представлена ​​на веб-сайте магазина. Сначала я запускаю запрос для разработки и возвращает следующий идентификатор заказа, который необходимо отправить клиенту, а затем использовать этот идентификатор заказа, чтобы отбросить каждую часть данных (адресная строка 1, адресная строка 2, купленные предметы и т. Д.) Из различные таблицы в реляционной базе данных.

Независимо от того, в каком направлении я иду по этому поводу, это беспорядочно. Я заканчиваю массивными методами, с одной переменной, определенной для каждой части данных, которая мне нужна, и каждая переменная равна возвращаемому значению метода, который у меня есть, который выполняет запрос к моей базе данных MySQL. Некоторым из данных нужна дополнительная логика (например, некоторые данные необходимо очистить, некоторые даты необходимо отформатировать определенным образом для XML).

Несколько пунктов

  • Я не создавал структуру базы данных или веб-сайт покупок, и я не могу изменить его
  • У меня есть рабочая программа, которая работает в данный момент. Это программа, которую я написал месяцев назад, что я возвращаюсь, чтобы улучшить

Некоторые примеры кода ниже:

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';"); 
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';"); 
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';"); 
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';")); 
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';"); 

if(valueFive == "FooBar") 
{ 
    //Do Stuff 
} 

string valueSix = myMethod("SELECT `valueSix` FROM `tableThree` WHERE `OrderID` = '12345';"); 
DateTime valueSeven = DateTime.Parse(myMethod("SELECT `valueSeven` FROM `tableFour` WHERE `OrderID` = '12345';")); 
string valueEight = myMethod("SELECT `valueEight` FROM `tableFive` WHERE `OrderID` = '12345';"); 
string valueNine = String.Format("QWERTY - {0} - YTREWQ", myMethod("SELECT `valueNine` FROM `tableSix` WHERE `OrderID` = '12345';")); 
string valueTen = myMethod("SELECT `valueTen` FROM `tableSeven` WHERE `OrderID` = '12345';"); 

     MyClass fooBar = new MyClass() 
     { 
      valueOne = valueOne, 
      valueTwo = valueTwo, 
      valueThree = valueThree, 
      valueFour = valueFour, 
      valueFive = valueFive, 
      valueSix = valueSix, 
      valueSeven = valueSeven, 
      mySecondClass = new MySecondClass() 
      { 
       valueEight = valueEight, 
       valueNine = valueNine, 
       myThirdClass = new MyThirdClass() { valueTen = valueTen } 
      } 
     }; 

SerializeToXML<MyClass>(fooBar); 

Представьте себе, что, но с гораздо большим количеством данных. Да, это работает, но это неопрятно, трудно поддерживать и, в более общем плане, не очень хорошо.

Итак, мой вопрос в том, как правильно собирать большие объемы данных в приложении .Net?

ответ

2

Сразу после битвы, похоже, вы можете объединить много запросов в один. Например, у вас есть следующие:

string valueOne = myMethod("SELECT `valueOne` FROM `tableOne` WHERE `OrderID` = '12345';"); 
string valueTwo = myMethod("SELECT `valueTwo` FROM `tableOne` WHERE `OrderID` = '12345';"); 
string valueThree = myMethod("SELECT `valueThree` FROM `tableTwo` WHERE `OrderID` = '12345';"); 
int valueFour = Convert.ToInt32(myMethod("SELECT `valueFour` FROM `tableThree` WHERE `OrderID` = '12345';")); 
string valueFive = myMethod("SELECT `valueFive` FROM `tableThree` WHERE `OrderID` = '12345';"); 

Я бы избавиться от этих индивидуальных запросов и использовать один один:

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive 
    FROM tableOne one 
    INNER JOIN tableTwo two on (two.OrderId = one.OrderId) 
    INNER JOIN tableThree three on (three.OrderId = one.OrderId) 
    WHERE one.OrderId = '12345'; 

Откровенно говоря, это выглядит, как вы можете сделать то же самое в другие.

Кроме того, я не совсем уверен, что делает myMethod, но он уверен, что он просто возвращает скалярное значение по запросу. Избавьтесь от этого и замените его тем, что даст вам DataTable или коллекцию объектов назад. Таким образом вы можете вытащить все данные, которые вам нужны за один раз.

ПРИМЕЧАНИЕ. Внутренние соединения работают, если вы ожидаете, что каждая из этих таблиц будет иметь значения на основе OrderId. Если они этого не сделают, выполните внешнее соединение, начиная с таблицы, которая всегда будет иметь существующую запись. Например:

SELECT one.valueOne, one.valueTwo, two.valueThree, three.valueFour, three.valueFive 
     FROM orders o 
     LEFT OUTER JOIN tableOne one on (one.OrderId = o.OrderId) 
     LEFT OUTER JOIN tableTwo two on (two.OrderId = o.OrderId) 
     LEFT OUTER JOIN tableThree three on (three.OrderId = o.OrderId) 
     WHERE o.OrderId = '12345'; 
1

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

я бы подойти к проблеме так:

  • Разработка наиболее эффективных консолидированных запросов, чтобы получить данные, которые вы потребность.
  • Для каждого запроса создайте класс. Структура ваших классов до соответствует вашим данным («пять основных групп, каждая из которых содержит 3 подгрупп»).
  • Следуйте за хорошими принципами ООП и скройте сложность , требуемую классом этого класса, если это единственное место, которое требуется .
  • Используйте гораздо более описательные имена для своих переменных и классы .

Это должно дать гораздо более читаемый, обслуживаемый, «аккуратный» код.

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