设计面向对象的数据库调用而不是基于字符串

时间:2011-11-18 07:16:18

标签: c# xml oop data-access-layer strong-typing

相关

Design Strongly typed object from 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抽象为Typed类吗?有没有人成功做过我现在想做的事情?你觉得哪个感觉舒服?

更多

上面只是一个数据库调用,我们对所有数据库调用都一样。我们肯定会陷入困境。

附加

  1. 使用C#2.0

  2. .NET 2.0

  3. SQL Server 2005

  4. Visual Studio 2005

2 个答案:

答案 0 :(得分:2)

这里有两个问题:

  • 您可以使用XML将参数传递给存储过程,而存储过程可以在不使用中间层的情况下以完全正常的方式获取参数
  • 您手动构建XML 。请不要这样做 - 即使使用.NET 2.0意味着您无法使用LINQ to XML,.NET也有很多良好的XML API。

所以,我建议:

  • 如果可能,请删除XML层。我意识到这可能不太可行。
  • 使用XmlDocument
  • 等API构建XML
  • 您不希望XML构建代码乱丢您的代码,当然 - 您是否需要几种不同的类型,这一点在您的帖子中尚不清楚;这将取决于您的请求变化多少。

(它并不是很明确你的意思&#34;我们得出的结论是,课程会解决问题&#34;或者#34;我看到相关的帖子和​​生成的课程&#34;所以#&#34;所以#&#34; 39;我可能错过了这一点。如果是,请编辑你的问题以澄清。)

答案 1 :(得分:2)

我个人建议在数据库中使用过多的xml;这是系统中最不可扩展的部分(你不能把它“廉价地”扩展出来),所以我不会花费所有时间来处理xml,而只是使用数据,数据输出 - 简单常规TSQL参数和网格。


然而!

构建xml的方法实际上非常错误 - 值应该是xml-escaped。但要回答这个问题 - 我会使用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();