【问题标题】:Fetching data from 2 tables using SqlParameter使用 SqlParameter 从 2 个表中获取数据
【发布时间】:2018-06-13 21:23:50
【问题描述】:

我正在尝试使用 Join 和 SqlParameter 从 2 个表中获取数据,但我在第二个表中得到空值。我正在使用 ASP.NET MVC。

这是我的模型、控制器和视图:

型号:

public class PersonalDetails
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string FatherName { get; set; }
    public string Dob { get; set; }
    public string State { get; set; }
    public int StateId{ get; set; }
    public string City { get; set; }
    public int CitytId { get; set; }
    public string EmailId { get; set; }
    public List<Qualifications> Qualifications { get; set; }
}

public class Qualifications
{
   public string className { get; set; }

  //  public int BoardId { get; set; }
    public string Board { get; set; }
    public double ObtainMarks { get; set; }
    public double MaxMarks { get; set; }
    public int Year { get; set; }
}

数据库模型

public List<PersonalDetails> showAll(int id)
{
    List<PersonalDetails> psd = new List<PersonalDetails>();

    SqlParameter[] para = new SqlParameter[]
            {
                new SqlParameter{ParameterName = "@ID",Value = id}
            };

    string query = @"sp_show_alldetails @ID";
    psd = this.Database.SqlQuery<PersonalDetails>(query, para).ToList();
    return psd;
}

和我的控制器

public ActionResult ShowAllDetails(int id)
{
    return View(new MyConnection().showAll(id).ToList());
}

查看

@model List<DropdownBind.Models.PersonalDetails>

@{
    ViewBag.Title = "ShowAllDetails";
}

<h2>ShowAllDetails</h2>
@foreach (var p in Model)
{
    <table>
        <tr>
            <td>Name</td>
            <td>@p.Name</td>
        </tr>
    </table>
    foreach (var x in p.Qualifications)
    {
        <table>
            <tr>
                <td>@x.className</td>
            </tr>
        </table>
    }
    break;
}

以及我正在使用的程序

procedure sp_show_alldetails   
    @ID int  
as  
begin  
    select 
        P.ID, P.Name, P.FatherName, C.CityName as City, 
        P.EmailId, S.StateName as State,
        Q.ObtainMarks, Q.MaxMarks, Q.Year, Q.className, 
        B.BoardName as Board  
    from 
        PersonalDetails P 
    join 
        QualiFicationDetails Q on Q.ID = P.ID 
    join 
        StateMaster S on s.StateID = P.State 
    join 
        CityMaster C on C.CityID = P.City 
    join 
        BoardMaster B on B.BoardId = Q.Board 
    where 
        P.ID = @ID
end

现在,当我运行此代码时,我有个人详细信息的值,但我无法获取资格部分的数据,它会引发空异常,因为其中没有获取任何值。我做错了什么?

【问题讨论】:

  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • @marc_s 感谢您的宝贵建议,下次我会牢记这一点。 :)
  • 将查询中的资格部分的联接替换为“左联接”。并将 Qualification 部分放在最后一个 join
  • @NaveenChandraTiwari 这毫无意义。如果内部连接限制了结果,则根本不会返回任何行,而不仅仅是丢失某些字段中的数据。左连接使其更有可能在限定条件中出现空列,如果有的话。
  • @avirk 不清楚您是如何在 PersonalDetails 类中填充 List&lt;Qualifications&gt; 的?存储过程只返回一个单一的平面结果集,它将填充类的主要属性。它不能像那样自动填充子列表。事实上,您的查询可能会为同一个人返回多行,因为连接,例如如果此人具有与其相关的多种资格。要填充List&lt;Qualifications&gt;,您需要运行一个单独的查询(如果您愿意,可以在同一个存储过程中)并获得一个单独的结果集。

标签: c# sql-server asp.net-mvc stored-procedures


【解决方案1】:

存储过程仅返回单个平面结果集,该结果集将填充类的主要属性。它不能像 List&lt;Qualifications&gt; 这样自动填充子列表。事实上,由于连接的原因,您的查询可能会为同一个人返回多行,例如如果此人具有与其相关的多种资格。

要填充List&lt;Qualifications&gt;,您需要运行单独的查询(如果您愿意,可以在同一个存储过程中)并获得单独的结果集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多