使用 C#、SQL Server 设计数据访问层

Posted

技术标签:

【中文标题】使用 C#、SQL Server 设计数据访问层【英文标题】:Designing Data Access Layer using C#, SQL Server 【发布时间】:2012-09-30 20:23:21 【问题描述】:

好的,正如标题所示,我正在为我目前正在研究的调查框架设计一个数据访问层。

我们都熟悉分层架构的概念,我们尝试以一种方式实现层之间的分离,即表示层可以连接到任何业务层,就像业务层可以连接到任何数据访问层一样,无论如何只要它保持相同的接口(相同的方法),它的实现。

现在,在使用 SQL Server 构建数据库之后,我正在使用 DataSet (*.xsd) 文件构建 DAL,并在此文件中为每个表适配器和数据库中的相应存储过程创建方法。

在 Visual Studio 中使用数据集可视化设计器工作了一段时间后,我注意到我的目标是提供一个非常灵活的 API,它以方法的形式为用户提供所有可能的查询。例如,我想为用户提供使用任何可能的过滤器或不使用过滤器对表执行检索操作的方法,我还希望用户能够使用她/他想要作为过滤器的任何列删除行,同时更新使用他想要的任何列作为过滤器的所有/单个字段。

我实现这一点的主要方法是为每个可能的查询创建一个方法,无论它是 DDL 还是 DML。现在,当我认为我可能在某个方法上犯了错误,或者我想检查这些方法以确保在快速打字时没有遗漏任何东西时,这似乎很痛苦,因为我最终得到了很多方法。

所以,我的问题是:是否有另一种方法来设计数据访问层,以便可以轻松地重构方法并创建它们?

我希望我没有详细说明,但我想把你放在图片中,以便我能得到正确的答案,提前谢谢

【问题讨论】:

您是否有任何理由不使用 .NET 3+ 并使用 Entity Framework?使用数据访问层时,它使事情变得更加容易。 我对 EF 的经验并不丰富,尽管它很简单。 EF 产品会是我在数据库中想到的表吗?如果我从创建类开始,我最终会得到相同的数据库吗? 是的,您可以很容易地使用 EF 并使用存储库,链接到您喜欢的任何提供程序。这是现在的一种常见做法,我强烈建议这样做。 【参考方案1】:

好吧,您可以使用 ORM 工具来提供良好的数据访问层。我的意思是因为使用 ORM 工具,您将支持大多数流行的数据库,如 SQL Server、Oracle、mysql、PostgreSql 等。

根据您使用的 wichi ORM 工具,您不必编写 SQL 语句,这意味着您对查询错误不太敏感。

我建议您检查一个名为 NHibernate 的工具。使用此 ORM,您可以使用 Linq 和另一个名为 QueryOver 的查询(更具体地用于 NHibernate)编写查询。您将有很多灵活性来编写动态查询。 使用 ORM 工具,您可以实现 Repository Pattern 并创建方法和查询以获取有效的数据访问权限。

所以,当你使用类似这样的东西时,你将获得像 Refecting 这样的 Visual Studio 的好处,因为 LinqQueryOver 是强类型的。但是你也会有 HQL,它就像 Sql Statment。

查看这篇文章:Why I don't use DataSets

【讨论】:

我也没有使用数据集编写任何查询。只是我必须为每个查询创建一个方法,这似乎非常重复,更不用说我最终使用的方法数量之多。 你可以创建一个通用存储库,看这个:daniel.wertheim.se/2009/11/04/nhibernate-repository-pattern。有了这个,你将有很多通用实现并让它工作。如果您需要更具体的东西,您可以从 Generic 继承并在基础上实现。是的,您必须在必要时编写一个特定的查询来提高性能! 如果您仍然对 ORM 工具不满意,我建议您搜索 MS Entity Framework(代码优先)。它很容易实现并且与 Sql Server 一起工作得很好,顺便说一下,NHibernate 是一个成熟的工具,但初始学习曲线比较复杂。 @FelipeOriani EF 不是 ORM 工具吗? 是的,Entity Framework 是一个很好的 ORM 工具。对不起,我觉得我表达得很糟糕。我只想说它比 NHibernate 更容易。

以上是关于使用 C#、SQL Server 设计数据访问层的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# .Net 访问 SQL Server 数据库的最佳方式

C# 访问 SQL Server 数据库存储过程和视图

将 Mdb 转换为 Sql Server

我们如何在 C# 中将访问数据库(.mdb)导入 sql server 2008

.net(c#)还原sql server 2005数据库,出错因为数据库正在使用,所以无法获得对数据库的独占访问权。

C# 学习笔记(17)操作SQL Server 上