Проектирование объектно-ориентированных вызовов базы данных, а не на основе строк - PullRequest
1 голос
/ 18 ноября 2011

относящиеся

Дизайн Строго типизированный объект из XML

В настоящее время мы выполняем хранимые процедуры на основе "SQL XML" где мы send xml string как входные данные для хранимых процедур и получить ответ от хранимых процедур как xml.Для простой демонстрации входа пользователя в приложение, вот как это делается

<Request Type="" CRUD="C/R/U/D">`
<Users>
<UserName></UserName>
<Password></Password>
</Users>
</Request>

не обращайте внимания на ответ из базы данных, потому что мы можем изменить на что угодно.Именно эта конструкция xml кажется нам слишком пугающей.Ниже приведен код, за которым мы следуем

StringBuilder _sbXml = new StringBuilder();
_sbXml.AppendLine("<Request Type='' CRUD=''>");
_sbXml.AppendLine("<Users>");
_sbXml.AppendLine("<UserName>"+ usernameVariable +"</UserName>");
_sbXml.AppendLine("<Password>"+ passwordVariable +"</Password>");
_sbXml.AppendLine("</Users>");
DataTier.BeginRequest(_sbXml.ToString());

мы пытались абстрагировать вещи в методы, но опять же мы никогда не решали проблему, которую хотели, просто спрятали их где-то.

Итак, мы пришли к выводу, что строгая типизация необходима для каждого запроса, чтобы избежать каких-либо опечаток, нежелательного поведения, избегать ручного кодирования xml и поддерживаемости

.Отсюда вопрос

  • Как я могу абстрагироваться от этой формы построения xml

  • XSD-инструмент может генерировать данные XML-моделирования для моделирования классов (Связанный пост), является ли класс, сгенерированный с помощью инструмента adaptive для долгосрочного запуска?

  • Желательно ли абстрагирование строки xml в типизированные классы?Кто-нибудь имел успех, делая то, что я пытаюсь сделать сейчас? С чем вы чувствовали себя комфортно?

Подробнее

Выше всего один вызов базы данных, мы получилиТо же самое для всех вызовов базы данных.У нас наверняка большой беспорядок.

Дополнительно

  1. Использование C # 2.0

  2. .NET 2.0

  3. SQL Server 2005

  4. Visual Studio 2005

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Лично я не рекомендую использовать слишком много XML в базе данных;это наименее масштабируемая часть вашей системы (вы не можете ее "масштабировать" дешево), поэтому вместо того, чтобы тратить все свое время на обработку xml, я бы просто использовал данные в, данные - просто регулярноПараметры и сетки TSQL.


Однако!

Такой подход построения xml довольно глючный - значения должны быть экранированы xml.Но чтобы ответить на вопрос - я бы использовал LINQ-to-XML (XElement) или XmlSerializer.Вероятно, последнее, то есть

public class Request {
    [XmlAttribute] public string Type {get;set;}
    [XmlAttribute] public string CRUD {get;set;} // although I'd prefer an enum

    public RequestUser Users {get;set;}
}
public class RequestUser {
    public string UserName {get;set;}
    public string Password {get;set;} // please use salted hash instead
}

затем:

var req = new Request { Type = "", CRUD = "",
          Users = new RequestUser { UserName = username, Password = password } };
var ser = new XmlSerializer(typeof(Request));
StringWriter sw = new StringWriter();
ser.Serialize(sw, req);
string xml = sw.ToString();

Основное преимущество, которое я вижу здесь с XmlSerializer (по сравнению с LINQ-to-XML), заключается в том, что вы можете также используйте это для считывания xml в этого формата через Deserialize.Однако LINQ-to-XML также будет хорошо работать здесь:

var req = new XElement("Request",
             new XAttribute("Type", ""),
             new XAttribute("CRUD", ""),
             new XElement("Users", 
                new XElement("UserName", username),
                new XElement("Password", password)
             )
          );
var xml = req.ToString();
2 голосов
/ 18 ноября 2011

Здесь есть две проблемы:

  • Передача параметров в хранимые процедуры с использованием XML, когда хранимые процедуры могут принимать параметры совершенно обычным способом без использования промежуточного слоя
  • Вы создаете свой XML вручную .Пожалуйста, не делайте этого - в .NET имеется множество хороших API-интерфейсов XML, хотя использование .NET 2.0 означает, что вы не можете использовать LINQ to XML.

Итак, япредложил бы:

  • Избавьтесь от слоя XML, если возможно.Я понимаю, что это может быть неосуществимо.
  • Сборка XML с использованием таких API, как XmlDocument и т. Д.
  • Вы не хотите, чтобы код для сборки XML засорял ваш код, разумеется - нужно ли вамнесколько разных типов для этого непонятно из вашего поста;это будет зависеть от того, насколько сильно варьируются ваши запросы.

(Не совсем понятно, что вы имели в виду под «мы пришли к выводу, что класс будет решать вещи» или «я видел соответствующий пост и сгенерированный класс», поэтомувозможно, я упускаю суть. Если это так, пожалуйста, отредактируйте свой вопрос, чтобы уточнить.)

...