【问题标题】:Razor Page returning only one row item from stored procedure - How to return all rows of procedure result?Razor Page 从存储过程中仅返回一个行项目 - 如何返回所有过程结果行?
【发布时间】:2019-09-17 00:49:41
【问题描述】:

我终于知道如何使用我的存储过程中的数据生成一个剃须刀页面。但只返回第一行或最后一行项目。

我尝试过使用nextresult(),但这没有奏效。我相信这仅适用于我期望来自多个表的数据。我的存储过程与其他表有一些连接,但只有一个结果集。我只需要打印该结果集中的所有值。

当我在 SSRS 或 SSMS 中执行存储过程时,会返回多个值。这是我的 SQL 代码。

SELECT Movies.MovieTitle, Movies.MovieYear, Genres.GenreName 
FROM Movies 
INNER JOIN GenresMovies AS gm ON gm.MovieID = Movies.MovieID
INNER JOIN Genres ON Genres.GenreID = gm.GenreID
WHERE Genres.GenreID IN (SELECT Number FROM [fn_SplitInt](@GenreID, ','))

这是我的访问层,根据反馈最新更新。

using System;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MyMovies.Models
{
    public class MovieDataAccessLayer
    {
        public List<Movies> GetMovieByMedia(byte? MediaID)
        {
            string connectionString = "Server=ServerName;Database=Movies;Trusted_Connection=True;MultipleActiveResultSets=true";
            var movies = new Movies();

            using (var con = new SqlConnection(connectionString))
            {
                using (var cmd = new SqlCommand("usp_MovieByMedia", con))
                {
                    cmd.Parameters.Add(new SqlParameter("@MediaID", SqlDbType.TinyInt) { Value = MediaID });
                    cmd.CommandType = CommandType.StoredProcedure;

                    con.Open();

                    using (var reader = cmd.ExecuteReader())
                    {
                        List<Movies> Movies = new List<Movies>();

                        while (reader.Read())
                        {
                            Movies movie = new Movies()
                            {
                                MovieTitle = reader["MovieTitle"].ToString(),
                                MovieYear = Convert.ToInt32(reader["MovieYear"])
                            };
                            Movies.Add(movie);
                        }
                    }

                    return Movies;
                }
            }
        }
    }
}

这是我执行存储过程的 cshtml.cs,最新更新。

namespace MyMovies.Pages.MovieDetails
{
    public class DetailsModel : PageModel
    {
        private readonly MyMovies.Models.MyMoviesContext _context;

        public DetailsModel(MyMovies.Models.MyMoviesContext context)
        {
            _context = context;
        }

        MovieDataAccessLayer objmovie = new MovieDataAccessLayer();
        public List <Movies> { get; set; }

        public async Task<IActionResult> OnGetAsync(byte? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            Movies = objmovie.GetMovieByMedia(id);

            if (Movies == null)
            {
                return NotFound();
            }

            return Page();
        }
    }
}

最后,显示结果表格的剃须刀页面,最新更新!

@page
@model MyMovies.Pages.MovieDetails.DetailsModel

@{
    ViewData["Title"] = "Details";
}

<table>
    <tr>
        <th>Movie Title</th>
        <th>Movie Year</th>
    </tr>
    @foreach (var item in Model.Movies)
    {
        <tr>
            <td class="col-sm-10">
                @Html.DisplayFor(Model => item.MovieTitle)
            </td>
            <td class="col-sm-10">
                @Html.DisplayFor(Model => item.MovieYear)
            </td>
        </tr>
    }
</table>

它返回第一个或最后一个行项目。我该怎么做才能让它全部归还?如果我尝试做一个 foreach 循环,我将不得不让我的电影类 IEnumerable。但是这样做,我无法弄清楚如何让我的存储过程工作。

【问题讨论】:

  • 你只返回一个,因为你使用一个模型但你需要使用 List
  • 在剃须刀页面中,您需要按列表模型使用 foreach
  • @evilGenius,所以我必须将电影更改为可枚举类型吗?您能否提供更多详细信息,因为我不熟悉 c#,所以我真的很难将这些拼凑起来。
  • 在使用 List 之前尝试时遇到了很多问题,主要是我无法将类型电影转换为列表。

标签: c# asp.net tsql stored-procedures razor-pages


【解决方案1】:
List<Movies> Movies = new List<Movies>();

while (reader.Read())
{
        Movies movie = new Movies()
        {
          MovieTitle = reader["MovieTitle"].ToString(),
          MovieYear = Convert.ToInt32(reader["MovieYear"])
        }

        Movies.Add(movie);
};

return Movies;

检查一下:

public List<Movies> GetMovieByMedia(byte? MediaID)
{
    string connectionString = "Server=ServerName;Database=Movies;Trusted_Connection=True;MultipleActiveResultSets=true";

    var movies = new Movies();

    using (var con = new SqlConnection(connectionString))
    {
        using (var cmd = new SqlCommand("usp_MovieByMedia", con))
        {
            cmd.Parameters.Add(new SqlParameter("@MediaID", SqlDbType.TinyInt) { Value = MediaID });
            cmd.CommandType = CommandType.StoredProcedure;

            con.Open();

            using (var reader = cmd.ExecuteReader())
            {
                List<Movies> Movies = new List<Movies>();

                while (reader.Read())
                {
                     Movies movie = new Movies()
                                    {
                                         MovieTitle = reader["MovieTitle"].ToString(),
                                         MovieYear = Convert.ToInt32(reader["MovieYear"])
                                    };
                     Movies.Add(movie);
                }
            }

            return Movies;
}

新代码

public List<Movies> Movies { get; set; }
Movies = objmovie.GetMovieByMedia(id);

剃须刀页面的标记:

@using Movies
<table>
@foreach(var item in model.Movies)
{
    <tr>
        <th class="col-sm-10">
            @Html.DisplayNameFor(model => item.MovieTitle)
        </th>
        <th class="col-sm-10">
            @Html.DisplayNameFor(model => item.MovieYear)
        </th>
    </tr>
}
</table>

我希望它有效。我无法检查这个

【讨论】:

猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多