2010-07-26 22 views
0

Cette question concerne le service Web ASP.NET que je crée en utilisant l'architecture DAL-BLL pour mon projet d'école finale.Comment retourner une valeur de jointure multi-table à partir de BLL

J'ai une procédure stockée, qui est une requête de sélection avec une jointure interne pour 2 tables. Par conséquent, la procédure stockée renvoie une valeur multi-table. Une de mes méthodes DAL tableAdapter accède à cette procédure stockée. Comment puis-je récupérer la valeur de retour dans la BLL? Dois-je créer une structure de classe similaire à celle supposée être retournée par le proc stocké? ou existe-t-il un moyen direct d'atteindre la même chose? Aide grandement appréciée. S'il vous plaît laissez-moi savoir si quelqu'un a besoin d'applet de code pour obtenir une meilleure compréhension. Merci

Voici quelques informations supplémentaires: J'utilise le jeu de données SQL (.xsd) dans DAL. J'ai donc un datatable appelé "Insurance", qui a un tableAdapter. Une des requêtes dans l'adaptateur fait référence à une procédure stockée, qui a une jointure interne. Donc, mon SP ressemble à:

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) 

Donc ce SP retourne une datable qui sera une combinaison des 2 tables dans la jointure interne. S'il vous plait corrigez moi si je me trompe.

Maintenant, dans mon BLL, j'ai:

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

où insAdapter est une instance de insuranceTableAdapter

Cela donne une erreur lors de l'exécution. Je peux exécuter le SP avec succès, donc je pense que le problème est seulement bcz je suis en train de retourner une mauvaise date de la BLL. Aidez-moi à résoudre ce problème.

+0

Oui - nous aurons besoin de code. Besoin de voir à quoi ressemble l'ensemble de résultats SQL et quelle technologie DAL vous utilisez (LINQ-SQL, ADO.NET classique, etc.) – RPM1984

+0

Merci d'avoir jeté un coup d'œil. J'ai mis plus d'informations dans ma question. S'il vous plaît laissez-moi savoir comment le résoudre. – Batul

Répondre

0

J'ai trouvé une solution :) Finalement, ça a marché.

J'ai créé un nouvel adaptateur de table à l'aide du concepteur de jeu de données et j'ai appelé le SP comme l'une des requêtes. La datatable ainsi créée, comprend tous les champs (de l'assurance et de l'assurance). Maintenant, ASP.NET peut détecter que le type de retour est le datatable nouvellement créé. Fonctionne comme un charme.

S'il existe une meilleure façon de résoudre ce problème, veuillez commenter.

Merci à tous pour votre temps.

0

Si vous utilisez un ensemble de données ADO .Net. L'assistant va certainement créer une table pour le même. maintenant de la couche DATAACCESS, procédez comme suit

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(); 
} 
  1. Catch ceci sur votre page interface utilisateur en suivant l'objet la création de BLL et appeler la méthode. Ici, dans BLL, vous pouvez également effectuer diverses opérations pour abaisser les codes dans votre interface utilisateur et le garder propre de diverses manipulations.
+0

Merci Amit, mais je ne suis pas en mesure de relier votre solution à ma situation. J'ai ajouté du code dans ma question, s'il vous plaît laissez-moi savoir comment votre solution est applicable. – Batul