【问题标题】:Where to place joins in 3 tier architecture在 3 层架构中放置连接的位置
【发布时间】:2014-06-12 00:15:53
【问题描述】:

我正在尝试实现三层架构。我需要将数据库查询的连接语句放在哪里?

即,如果我有一个 Bill 类,它将有两个表 BillingMaster 和 BillingDetail。对于插入/更新/删除,我可以使用如下

数据库层

Class BillingMaster
{
public int BillId;
public double BillAmt;
public void save()
{
      .....
  }
  public void update()
  {
      .....
  }
}
Class BillingDetatil
{
  public int BillId;
  public string Item;
  public double Amount;
  public void save()
  {
      .....
  }
  public void update()
  {
      .....
  }
} 

我需要获取数据并以表格格式将它们加入 billingmst 和 billingdet。我需要在哪里给出连接查询?

---------我正在修改关于我从 Kayaman 和 Ali 获得的输入的问题----

我正在修改案例,就像我需要两个报告一样,比如客户明智的账单详细信息、某个日期范围内的账单

我也可以这样编码

BAL

class BALBill
{
     public dataset getCustWiseBillDetails()
     {
          DBManager oDBM=new DBManager()  //Class supporting db operations
          String strsql="select CustId,CustName,BillNo,BillAmt,Item,Amount FROM CustMst cm"
          strSql+="\n join BillingMst bm on bm.CustId=cm.CustId"
          strSql+="\n join BillingDet bd on bm.BillNo=bd.BillNo"
          retrun oDBM.fnExecute(strSQL);
     }

     public dataset getBillsInADateRange(DateTime dtFrom,DateTime dtTo)
     {
          DBManager oDBM=new DBManager()  //Class supporting db operations
          String strsql="select BillNo,BillAmt,Item,Amount FROM BillingMst bm on bm.CustId=cm.CustId"
          strSql+="\n join BillingDet bd on bm.BillNo=bd.BillNo"
          strSql+="\n where BillDate between " + dtFrom " and " + dtTo
          retrun oDBM.fnExecute(strSQL);
     }
     public sub SaveBillMst(BillingMst bM)
     {
           DBManager oDBM=new DBManager()  //Class supporting db operations
          String strsql="insert into BillingMst(BillNo,BillAmt)"
          strsql+="\n values(" + bM.BillNo + ", " +bM.BillAmt+")"
          oDBM.fnExecuteNonQuery(strSQL);
     }
     public sub SaveBillMst(List<BillingMst> bLM)
     {

          DBManager oDBM=new DBManager()  //Class supporting db operations
          foreach(BillingMst bM in BLM)
          {
             String strsql="insert into BillingMst(BillNo,BillAmt)"
             strsql+="\n values(" + bM.BillNo + ", " +bM.BillAmt+")"
             oDBM.fnExecuteNonQuery(strSQL);
          }
     }
     public sub SaveBillDet(BillingDet bD)
     {
           DBManager oDBM=new DBManager()  //Class supporting db operations
          String strsql="insert into BillingMst(BillId,Item,Amount)"
          strsql+="\n values(" + bD.BillNo + ", '" +bD.Item+"',"+bD.Amount+")"
          oDBM.fnExecuteNonQuery(strSQL);
     }
     public sub SaveBillDet(List<BillingDet> bLD)
     {

          DBManager oDBM=new DBManager()  //Class supporting db operations
          foreach(BillingMst bD in bLD)
          {
             String strsql="insert into BillingMst(BillNo,BillAmt)"
             strsql+="\n values(" + bM.BillNo + ", " +bM.BillAmt+")"
             oDBM.fnExecuteNonQuery(strSQL);
          }
     }
     public sub SaveBill(DALBill b)
     {
          saveBillMst(b.bM);
          saveBillDet(b.bLD);
     }
     public sub SaveBill(List<DALBill> bL)
     {
          foreach(DALBill b in bL)
          {
              saveBillMst(b.bM);
              saveBillDet(b.bLD);
           }             
     }
}

DAL

class BillingMst
{
     public int BillId;
     public double BillAmt;
}
class BillingDet
{
     public int BillId;
     public string Item;
     public double Amount;
}
class DALBill
{
     public BillingMst bM;
     public List<BillingDet> bLD;
}

我走对了吗?

【问题讨论】:

  • 这完全不相关,但是当你使用缩写“e.g.”时,它的意思是“for example”(千万不要说“for e.g.”)。
  • 完全不相关是什么意思? “我的帖子发错地方了”或“我在说不相关的事情?我有一个不遵循任何标准的库存软件。我正在尝试融入架构,因为厌倦了一遍又一遍地输入相同的代码。但是要显示东西我必须使用网格。那时会有很多加入,就像某些项目可能从 challan 收取一样。有些项目将从计费等中获得回报。所有这些地方我需要使用“sql joins”来查找数据库中的内容?我的问题是这些操作在我的代码中的什么位置?
  • 我是说我的评论完全不相关——它与您的问题无关,与您的措辞有关。为了将来参考,当你说“例如”时,你应该用“例如”来代替,当你说“即”时。您应该替换“就是”这个词 - 如果这些替换没有语法或语义意义,那么您使用它们不正确(我对“即”有很多内疚)。

标签: c# java sql architecture 3-tier


【解决方案1】:

你显然把它放在你用来从数据库中读取数据的类中。您现在拥有CUD 对象(创建、更新、删除),但您仍然需要读取。

选择权取决于您,但请记住,您使用的方法并不是最佳的。如果您想在单个事务中插入 100 个对象怎么办?你会在每个对象上调用save() 吗?用户是否对交易负责?

一种更标准的方法是,您为每个对象类型都有一个DAO(数据访问对象),其中将包含它所需的所有(CRUD)操作。

有与您类似的解决方案(例如 Ebean),但您可能想先学习“基本”方法,然后查看 JPA/Hibernate 和其他持久性解决方案。

【讨论】:

  • 感谢您的建议。我还没有开始。所以我需要最好的方法。你能指导我上面的事情吗?能否提供账单示例(数据访问、业务层将包含哪些内容)?
【解决方案2】:

我相信这两个表之间会有关系,每个细节记录都会有 Master's PK 作为 foreign key ,创建一个 GetByPK 的方法来检索 BillingMaster 中提供的 primray 键的记录。通过这种方式,您可以从两个表中获取信息,就像

BillingDetatil detail = new BillingDetatil();

detail.BillingMaster. // here you can access all the fields

您可以对主表进行同样的操作,如果您想访问该主表的所有子详细信息,请在主表中放置一个列表

您将在您的BLL Business Logic Layer 中进行操作

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2016-04-14
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多