Страница Razor, возвращающая только один элемент строки из хранимой процедуры - Как вернуть все строки результата процедуры? - PullRequest
0 голосов
/ 28 апреля 2019

Я наконец-то понял, как создать страницу бритвы с данными из моей хранимой процедуры.Но возвращается только первый или последний элемент строки.

Я пытался использовать 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>

Возвращает либо первый, либо последний элемент строки.Что я могу сделать, чтобы вернуть все?Если я попытаюсь сделать цикл по каждому элементу, мне придется сделать урок по моим фильмам IEnumerable.Но, делая это таким образом, я не мог понять, как заставить мою хранимую процедуру работать.

1 Ответ

0 голосов
/ 28 апреля 2019
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>

Я надеюсь, что это работает. Я не могу проверить это

...