我正在从头开始创建我的任务项目,我开始创建一个处理SQL连接并可以执行存储过程的DAL。
该项目稍后将成为CMS或博客
我的DAC或DAL正在从web.config
读取连接字符串并接受arrays of SQL Parameters
和Stored 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.我的方法出了什么问题?
答案 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工具中)。
答案 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)
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中进行更改时都必须更新所有依赖代码。
最好创建代表数据库的简单类。通过这样做,您只需在更改数据库时更改这些对象(或映射层)的内部。
我建议您阅读有关存储库模式的信息。这是抽象数据源的最常见方式。