从DAL返回DataTable或DataSet是错误的方法

时间:2012-03-14 16:17:59

标签: asp.net vb.net architecture data-access-layer

我正在从头开始创建我的任务项目,我开始创建一个处理SQL连接并可以执行存储过程的DAL。 该项目稍后将成为CMS或博客 我的DAC或DAL正在从web.config读取连接字符串并接受arrays of SQL ParametersStored Procedure Name,并在DataTable中返回已执行存储过程的输出。
我按如下方式呼叫我的DAC(using class functions,有时使用后面的代码)

Dim dt As DataTable = Dac.ReturnDataTable("category_select_bypage",  New SqlParameter("@pageid", pageid), New SqlParameter("@id", id))

哪个工作正常,我假设通过调用此DAC并使用存储过程插入和检索数据来完成我的整个应用程序,或者稍后可能是简单的查询。
但是,我已经向老师展示了这项工作,他告诉我you are using a wrong approach并且你的代码没有达到正确的DAL方法。
所以,我现在对DAL和DAC太混淆了。这里有什么主要问题。

1. DAL和DAC之间的真正区别是什么? 2.通过使用我的方法,用它做什么样的应用是好的?我可以用这种方法制作购物车吗? 3.我的方法出了什么问题?

5 个答案:

答案 0 :(得分:2)

我认为你可以从这些链接开始:
  - http://msdn.microsoft.com/en-us/library/aa581778.aspx
  - http://martinfowler.com/eaaCatalog/(数据源架构模式)
  - http://www.simple-talk.com/dotnet/.net-framework/.net-application-architecture-the-data-access-layer/(它谈到了DataSet,我猜你可以使用它们,直到应用程序很小或非常简单:它们众所周知并且深入集成在许多VS工具中)。

看看SO问题:How to organize Data Access Layer (DAL) in ASP.NET

答案 1 :(得分:2)

阿德里亚诺提供了一个非常好的链接。当然必须阅读。但我确实看到了一件事。在应用程序中创建逻辑层时,每个层都不知道其下方的内部工作方式。例如,表示层不知道数据层如何获取数据,这只是魔术。如果您决定不使用SqlClient并选择其他技术,原因就在于此。现在通过对图层使用“技术隐藏”,您可以非常轻松地进行更改。

所以考虑到你所拥有的,我假设DataTable位于演示(或应用程序)层。并且,如果确实如此,则DAC方法调用不应公开与检索数据的内容或方式相关的任何内容。在您的情况下,SqlParameter参数违反了此规则。也许你可以传递字符串或int。例如:

public DataTable Dac.GetPage(int pageId, int id)

从不如此,祝你好运。我很高兴看到那些愿意学习和愿意教导的人。

答案 2 :(得分:1)

我认为回归DataSets很容易被描述为“错误”。

您的DAL纯粹作为抽象服务,因此(假设)我们可以交换数据库,或者从数据库更改为XML文件或其他任何内容。应用程序的其余部分保持不变。

只要您的业务逻辑对从DAL传递DataSet的合同感到满意,我认为这不是架构问题。它可能不是最理想的,因为DataSets在资源方面可能相当昂贵,但它们在.Net中得到了很好的支持(它们是更简单的体系结构的基础,如事务脚本或表模式)。

您可能拥有的是一些自定义对象,并让DAL将其SQL查询结果转换为这些对象,然后可以由业务逻辑层处理它们。

但是我可以想到你可能想要DataSet的情况......

当然,所有主观性;)

答案 3 :(得分:1)

数据访问SQLServer层中的函数:

public override DataTable abc()
{
   //Connection with database
}

数据访问层中的功能:

public abstract DataTable abc();

业务逻辑层中的功能:

public DataTable abc()
{
  //Preparing the list
}

表示层中的功能:

using (DataTable DT =  (new BusinessLogicLayerClass()).abc())
{
}

上述方法是根据DataTable。但它应该返回类的返回列表到演示文稿。列表准备工作应该在业务逻辑层中完成。

答案 4 :(得分:1)

DataSet / DataTable的问题在于它代表了您的数据库。在任何地方使用它都会创建与数据库的高耦合。

这意味着每次在db中进行更改时都必须更新所有依赖代码。

最好创建代表数据库的简单类。通过这样做,您只需在更改数据库时更改这些对象(或映射层)的内部。

我建议您阅读有关存储库模式的信息。这是抽象数据源的最常见方式。