【问题标题】:Designing Object Oriented database calls rather than string based设计面向对象的数据库调用而不是基于字符串
【发布时间】:2012-01-01 00:21:07
【问题描述】:

相关

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

【问题讨论】:

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


    【解决方案1】:

    我个人建议在数据库中使用过多的 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 in,通过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();
    

    【讨论】:

    • +1 least scalable part of your system (you can't scale it "out" cheaply) 他们不会听 :( 但感谢您让我知道 xmlSerializer 能够完成这项任务。
    【解决方案2】:

    这里有两个问题:

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

    所以,我建议:

    • 如果可能的话,去掉 XML 层。我意识到这可能不可行。
    • 使用 API 构建 XML,例如 XmlDocument
    • 您当然不希望构建 XML 的代码乱七八糟地乱扔代码 - 您是否需要几种不同的类型,这在您的帖子中并不清楚;这取决于您的要求有多大变化。

    (不清楚您所说的“我们得出的结论是一个课程可以解决问题”或“我看到了相关的帖子并生成了课程”是什么意思,所以我可能没有抓住重点。如果是这样,请编辑您的需要澄清的问题。)

    【讨论】:

    • 感谢答案,但这是一种情况,xml 中的元素可以嵌套,例如:GetCategories("1","2","3","4"); 我可以从中构建 xml &lt;CategoryId&gt;1&lt;/CategoryId&gt;. . . .. 并且存储过程可以循环遍历元素以获取类别并返回它们。但是conventional stored procedure would require n number of parameters to get n number categories。你同意? For answer 2我的错误指定了它是.net 2.0
    • certainly - whether you need several different types for this is unclear请浏览更多信息
    • @Deeptechtons:我已经编辑了答案以删除使用 LINQ to XML 的建议,但您仍然可以使用 XmlDocument 等。没有理由构建手动 XML。我相信,您可以使用表值参数在单个参数中将多个值传递给存储过程。
    • @Deeptechtons 确实是 TSQL 的一个小问题,但这是一个“已解决的问题”; “拆分”UDF 在这里很常见(例如,传递 '1,2,3,4' 并在 , 上拆分),表值参数也是如此。就个人而言,我更喜欢“在调用站点构建参数化 TSQL”(而不是 procs);例如,“dapper”允许使用简写 Query&lt;Type&gt;("... where id in @ids", new { ids }),其中 ids 是一个列表(或类似列表) - 然后,d​​apper 将弄清楚如何将其编写为 TSQL 并适当地对其进行参数化
    • @JonSkeet 编辑的问题(见粗体文字和引号)感谢您的回答 +1
    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2022-10-14
    • 1970-01-01
    • 2018-02-04
    • 2019-10-05
    相关资源
    最近更新 更多