使用VS 2008中的类型化数据集编程模式

时间:2008-11-17 10:44:50

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

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

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

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

在向导中,选择预定义的连接字符串“use SQL statements”

从tablename中选择*,然后选择next + next。 (我为我的数据库中的每个表生成一个表适配器)

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

cpcDS.tbl_cpcRow tr =(cpcDS.tbl_cpcRow)(new cpcDSTableAdapters.tbl_cpcTableAdapter())。GetData()。选择(“cpcID =”+ cpcID)[0];

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

作为旁注,我认为这是一个相当不错的设计模式,用于从vs2008中的数据库获取数据。使用,读取和保存代码相当容易。但我想知道还有其他更好的设计模式吗?我使用数据集进行读取/更新/插入和删除。

3 个答案:

答案 0 :(得分: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(谓词)]允许数据上下文充分利用本地内存数据 - 即如果谓词只在主键列上,它可能如果数据上下文已经看到该记录,则根本不必触摸数据库。

然而,LINQ非常灵活;您也可以使用“查询语法” - 例如,略有不同的(列表)查询:

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

答案 1 :(得分:1)

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

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

另一个是可维护性。使用类型化数据集通常是更深层问题的症状,我猜测所有业务规则都存在于数据集之外,并且其中很少一些将数据集作为输入并基于它们输出一些聚合值。这会导致业务逻辑泄漏到所有地方,尽管在前6个月它们都会变得非常笨拙,但它会在一段时间后开始咬你。 DataSet的这种使用基本上是非面向对象的

话虽这么说,使用数据集建立一个合理的架构是完全可能的,但它并不是很自然。 ORM最初将难以设置,但是它可以很好地编写可维护和可测试的代码,因此您不必回顾过去6个月后发生的混乱。

答案 2 :(得分:0)

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

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

除非您的数据模型非常复杂,否则

类型化数据集非常有意义。然后编写自己的ORM将是最佳选择。我有点困惑,为什么安德烈亚斯认为类型化的数据集很难维护。关于它们唯一令人讨厌的事情是每当更改select命令时都会删除insert,update和delete命令。

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