Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 三层系统中数据库层的正确抽象?_C#_.net_Database_Data Access Layer - Fatal编程技术网

C# 三层系统中数据库层的正确抽象?

C# 三层系统中数据库层的正确抽象?,c#,.net,database,data-access-layer,C#,.net,Database,Data Access Layer,我正在创建一个三层应用程序。基本上是这样的 客户端->(通过可选的服务器 成为瘦客户机)->业务逻辑-> 数据库层 基本上是这样做的,这样就不会有任何跳跃。因此,我希望所有SQL查询等都位于数据库层 嗯,现在我有点困惑了。我创建了几个静态类来启动数据库层,但是对于数据库连接我应该做什么呢?我应该在任何时候进入数据库层时创建一个新的数据库连接,还是这样做会浪费时间?每当您有一个ConnectionPool时,Connection.Open()会花费时间吗 对我来说,业务层必须将IdbConnect

我正在创建一个三层应用程序。基本上是这样的

客户端->(通过可选的服务器 成为瘦客户机)->业务逻辑-> 数据库层

基本上是这样做的,这样就不会有任何跳跃。因此,我希望所有SQL查询等都位于数据库层

嗯,现在我有点困惑了。我创建了几个静态类来启动数据库层,但是对于数据库连接我应该做什么呢?我应该在任何时候进入数据库层时创建一个新的数据库连接,还是这样做会浪费时间?每当您有一个ConnectionPool时,Connection.Open()会花费时间吗


对我来说,业务层必须将IdbConnection对象传递到数据库层是错误的。似乎数据库层应该处理所有特定于DB的代码。你怎么认为?我如何在保持实用性的同时以正确的方式来做呢

仅在需要时打开连接。 不要维护与数据库的连接,这样会浪费很多。 当然你的数据库层会打开连接,我不知道为什么你认为BLL会将连接传递给数据库。BLL不知道数据库(至少它不应该知道),它应该处理业务规则等等。实际连接在db层打开

以下链接显示了BLL的外观:

连接字符串本身应该只是db layer类中的一个私有字符串变量,您应该能够从web.config文件中提取连接字符串信息。

您可以创建一个类(或类的名称空间,取决于大小)来承载数据库层。在数据库类中,您应该只使用数据库层中的连接池。该池将在任何给定时间保持n个连接对数据库开放,因此您只需使用其中一个池连接运行查询,而不会产生大量开销

有了这个功能,您的数据库层应该提供业务层可以调用的公共方法的“API”。这些方法都不应该公开数据库连接对象——这些细节是数据层内部的

然后从业务层开始,每次需要运行查询时,只需调用数据库层的“API”


这有帮助吗?

每次进入数据库层时都可以创建并打开一个新连接,并在完成连接后立即关闭连接。Net/Sql Server能够很好地处理连接池,这是可以接受的方法

您没有从业务层传入连接字符串也是正确的。它应该是数据层的私有(但可配置)成员。

传统上,单独的“数据访问层”为检索和提交数据提供数据库上下文。为此,有几种众所周知的模式,例如存储库。ADO.NET还实现了其他一些功能,例如提供程序


实体框架和LINQ to SQL也是进一步封装和简化数据层隔离的良好选项。

由于连接池,每次访问数据库时打开一个新连接通常不是问题

如果您可以重用打开的连接,而不必让连接长时间处于打开状态,也不必冒离开孤立打开的连接的风险,那么重用打开的连接并没有什么坏处。(实际上,我在访问db的所有类中都注入了一个datatool。这主要是出于单元测试的目的,但它也允许我有选择地保持连接打开,以供对db的多个调用使用。)

但同样,你不应该过分强调打开/关闭很多连接。更重要的是,您的DAL:

  • 可维护、简单、灵活
  • 表现尽可能好
  • (最重要的)始终正确处理其连接

您不使用ORM有什么特别的原因吗?我发现不用手工编写SQL查询,更不用说连接管理,可以节省20-50%的开发时间,缓存和所有其他方面的好处。因为这是一个简单的过程,以我们的旧项目与垃圾负载的SQL,并把它带到新的项目。下面的答案有任何帮助你吗?是的,有点烦人,当你给出一个好的答案,而没有得到一个赞成票。我认为所有其他答案实际上都很好,所以我会指出。是的,但这取决于应用程序。如果你每天运行一百万个查询,你会希望有持久的连接,以避免不断设置新查询的开销。@Justin-我更想解释BLL的功能。你所说的是另一个话题本身。需要从OP获得更多信息。