在3层架构中放置连接的位置

时间:2014-04-26 06:17:02

标签: c# java sql architecture 3-tier

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

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

DB Layer

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;
}

我是在正确的道路上吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

我相信这两个表会有它们之间的关系,每个详细记录都有Master's PKforeign key,制作一个GetByPK方法,用于检索提供的初始密钥的记录。 BillingMaster。通过这种方式,您可以从两个表中获取信息,就像

一样简单
BillingDetatil detail = new BillingDetatil();

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

与master表相同,如果要访问该master的所有子详细信息,请将List放入Master中

您将在BLL Business Logic Layer

中执行此操作