2010-07-26 63 views
0

这个问题关于我使用DAL-BLL体系结构为我的最终学校项目创建的ASP.NET webservice。如何返回来自BLL的多表连接值

我有一个存储过程,这是一个选择查询与2表的内部联接。因此存储过程返回多表值。我的一个DAL tableAdapter方法访问此存储过程。我如何检索BLL中的返回值?我是否必须创建类似于应该由存储过程返回的类结构?还是有直接的方法来实现?非常感谢。请让我知道,如果有人需要代码小程序,以获得更好的理解。谢谢

以下是一些更多信息: 我正在使用DAL中的SQL数据集(.xsd)。所以我有一个名为“Insurance”的数据表,它有一个tableAdapter。适配器中的其中一个查询引用了具有内部联接的存储过程。所以我的SP看起来像:

ALTER PROCEDURE dbo.GetInsurancesPaged 
    (
     @startRowIndex int, 
     @maximumRows int, 
     @patientID int 
    ) 
AS 
    select * from 
    (
    SELECT Insurance.insuranceID, Insurance.memberID, Insurance.groupID, Insurance.accountType, Insurance.comments, Insurance.patient, Insurance.company, InsuranceCompany.companyID, InsuranceCompany.companyName, InsuranceCompany.address, InsuranceCompany.phone, InsuranceCompany.fax, ROW_NUMBER() over (order by Insurance.dateModified DESC) as ROWRANK 
FROM Insurance INNER JOIN InsuranceCompany ON Insurance.company = InsuranceCompany.companyID 
WHERE Insurance.patient = @patientID 
    ) 
    AS DataWithRowNumbers 
WHERE ROWRANK > @startRowIndex AND ROWRANK <= (@startRowIndex + @maximumRows) 

所以这个SP返回一个数据表,这将是内部联接中的两个表的组合。如果我错了,请纠正我。

现在在我的BLL,我有:

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)] 
    public mySys.InsuranceDataTable GetInsurancesPaged(int startRowIndex, int maximumRows, int patientID) 
    { 
     return insAdapter.GetInsurancesPaged(startRowIndex, maximumRows, patientID); 
    } 

其中insAdapter是insuranceTableAdapter

的实例,这给执行上的错误。我可以成功地执行SP,所以我认为问题只是BCL我想从BLL返回一个错误的数据表。 请帮我解决这个问题。

+0

是的 - 我们需要一些代码。需要查看SQL Result Set的外观,以及您正在使用的DAL技术(LINQ-SQL,经典的ADO.NET等) – RPM1984 2010-07-26 03:48:04

+0

感谢您看看它。我在我的问题中提供了更多信息。请让我知道如何解决它。 – Batul 2010-07-26 20:22:00

回答

0

找到了解决办法:) 终于搞定了。

我使用数据集设计器创建了一个新的表格适配器,并将SP称为那里的查询之一。由此创建的数据表包含所有字段(来自Insurance和InsuranceCompany)。现在,ASP.NET可以检测到返回类型是新创建的数据表。 工程就像一个魅力。

如果有更好的方法来解决这个问题,请评论。

谢谢大家的时间。

0

如果使用ADO .Net数据集。该向导将定义创建一个相同的表。现在从数据访问层,执行以下步骤

1. Create a object of dataset. (DLL) 

Private YourCustomeDataSetDatatable DataAccess() 
{ 
YourCustomDataSet ds = new YourCustomDataSet(); // also called strongly typed dataset 
YourCustomeDataSetDatatable dt = ds.YourCustomeDataSetDatatable() 
YourCustomeDataSetTableAdapter ta = new ds.YourCustomeDataSetTableAdapter(); // table adapter that will be invoked 
ta.Fill(dt); // or if you have set to return only you can also use GetData() 
} 

2. Now in business layer 

Private YourCustomeDataSetDatatable DataAccess() 
{ 
// create a object of DLL. 
MyDAL myDal = new MyDAL(); 
return myDal.DataAccess(); 
} 
  • 捕捉由以下BLL的创建对象和调用该方法这对你UI页面。在BLL中,您还可以执行各种操作来降低您的密码,并使其不受各种操作的干扰。
  • +0

    谢谢阿米特,但我无法将您的解决方案与我的情况联系起来。我在我的问题中添加了一些代码,请让我知道您的解决方案是如何适用的。 – Batul 2010-07-26 20:23:10