我目前正在执行以下操作以在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中的数据库获取数据。使用,读取和保存代码相当容易。但我想知道还有其他更好的设计模式吗?我使用数据集进行读取/更新/插入和删除。
答案 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的速度优势使您可以专注于应用程序本身而不是数据访问代码。