【问题标题】:Programming pattern using typed datasets in VS 2008在 VS 2008 中使用类型化数据集的编程模式
【发布时间】:2010-09-22 15:46:32
【问题描述】:

我目前正在执行以下操作以在 vs2008 中使用类型化数据集:

右击“app_code”添加新数据集,命名为tableDS。

打开tableDS,右键,添加“表格适配器”

在向导中,选择一个预定义的连接字符串,“使用 SQL 语句”

select * from tablename and next + next 完成。 (我为数据库中的每个表生成一个表适配器)

在我的代码中,当我只需要一个数据时,我会执行以下操作来获取一行数据:

cpcDS.tbl_cpcRow tr = (cpcDS.tbl_cpcRow)(new cpcDSTableAdapters.tbl_cpcTableAdapter()).GetData().Select("cpcID = " + cpcID)[0];

我相信这将从数据库中获取整个表并在 dotnet 中进行过滤(即不是最佳的),有什么方法可以让 tableadapter 来过滤数据库上的结果集(即我想要的将 select * from tbl_cpc where cpcID = 1 发送到数据库)

顺便说一句,我认为这是从 vs2008 中的数据库获取数据的一种相当不错的设计模式。它的编码、阅读和维护相当容易。但我想知道还有其他更好的设计模式吗?我使用数据集进行读取/更新/插入和删除。

【问题讨论】:

    标签: c# sql visual-studio-2008 .net-2.0 dataset


    【解决方案1】:

    有点转变,但您询问不同的模式 - LINQ 怎么样?由于您使用的是 VS2008,因此有可能(尽管不能保证)您也可以使用 .NET 3.5。

    LINQ-to-SQL 数据上下文提供了对数据的更多托管访问(过滤等)。这是一个选项吗?不过,我目前不确定是否会使用“实体框架”(see here)。

    根据请求编辑:

    要从数据上下文中获取一行,您只需指定“谓词” - 在这种情况下,主键匹配:

    int id = ... // the primary key we want to look for
    using(var ctx = new MydataContext()) {
       SomeType record = ctx.SomeTable.Single(x => x.SomeColumn == id);
       //... etc
    
       // ctx.SubmitChanges(); // to commit any updates
    }
    

    上面使用 Single 是经过深思熟虑的 - 这种特殊用法 [Single(predicate)] 允许数据上下文充分利用本地内存数据 - 即,如果谓词仅在主键列上,它可能如果数据上下文已经看到该记录,则根本不必接触数据库。

    但是,LINQ 非常灵活;您还可以使用“查询语法”——例如,稍微不同的(列表)查询:

        var myOrders = from row in ctx.Orders
                       where row.CustomerID = id && row.IsActive
                       orderby row.OrderDate
                       select row;
    

    【讨论】:

    • LINQ-to-SQL 数据上下文是一个选项。你能给我一些与上面相同的示例代码吗? (即从表 tbl_cpc 中取出一行数据?)
    【解决方案2】:

    使用类型化数据集有两个潜在问题,

    一个是可测试性。在使用类型化数据集时,设置要在单元测试中使用的对象是相当困难的工作。

    另一个是可维护性。使用类型化的数据集通常是更深层次问题的症状,我猜你所有的业务规则都存在于数据集之外,其中相当一部分将数据集作为输入并基于它们输出一些聚合值。这会导致业务逻辑到处泄漏,尽管前 6 个月一切都是虚无缥缈的,但一段时间后它就会开始咬你。数据集的这种使用基本上是非面向对象的

    话虽如此,使用数据集建立一个合理的架构是完全可能的,但这并不是自然而然的。最初设置 ORM 会更困难,但它很适合编写可维护和可测试的代码,因此您不必回顾 6 个月后所造成的混乱。

    【讨论】:

    • 既然您显然不喜欢数据集,您建议我如何从数据库中获取数据并写入代码?
    • 很少有对象技术比用于测试的数据集更容易设置对象。 1) 填充数据(手动或查询),2) 保存到 xml,3) 从保存的 xml 重新填充以进行测试(一个示例)。此外,由于它们的部分类,说 DataSet 是“非面向对象的”是愚蠢的。
    【解决方案3】:

    您可以将带有 where 子句的查询添加到您感兴趣的表的 tableadapter。

    LINQ 很好,但它实际上只是 OP 已经在做的事情的快捷语法。

    除非您的数据模型非常复杂,否则类型化数据集非常有意义。那么编写自己的 ORM 将是最好的选择。我对 Andreas 为什么认为类型化数据集难以维护感到有些困惑。它们唯一令人讨厌的地方是,只要更改了 select 命令,insert、update 和 delete 命令就会被删除。

    此外,与您自己的 ORM 相比,创建类型化数据集的速度优势让您可以专注于应用程序本身,而不是数据访问代码。

    【讨论】:

      猜你喜欢
      • 2012-12-13
      • 1970-01-01
      • 2011-04-08
      • 2020-09-27
      • 2015-09-30
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多