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

本文关键字:字符串 面向对象的 数据库 调用 | 更新日期: 2023-09-27 18:15:10

相关

从XML 设计强类型对象

目前,我们运行基于"SQLXML">的存储过程,其中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

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

这里有两个问题:

  • 当存储过程可以在不使用中间层的情况下以完全正常的方式获取参数时,您将使用XML将参数传递给存储过程
  • 您正在手工构建XML。请不要这样做-.NET有很多优秀的XMLAPI,尽管使用.NET 2.0意味着不能使用LINQ to XML

因此,我建议:

  • 如果可能的话,去掉XML层。我意识到这可能不可行
  • 使用XmlDocument等API构建XML
  • 当然,您不希望XML构建代码乱丢代码——从您的文章中还不清楚您是否需要几种不同的类型;这将取决于您的请求有多大差异

(目前还不清楚你所说的"我们得出结论,一个类可以解决问题"或"我看到了相关的帖子并生成了类"是什么意思,所以我可能没有抓住要点。如果是这样,请编辑你的问题以澄清。(

就我个人而言,我不建议在数据库中使用过多的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(的主要优势是,您还可以使用它通过Deserialize格式读回XML。然而,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();