Отображение результирующего набора вида Db в asp. net основном виде - PullRequest
0 голосов
/ 17 марта 2020

Я выполняю хранимую процедуру из моего основного приложения asp. net. Процедура выполняет оператор выбора из представления БД. Внутренний вид базы данных объединяет 3 таблицы. Когда я выполняю следующий код, результирующий набор приходит как int, выдавая исключение, поскольку представление бритвы ожидает List, мне нужно получить его как список, чтобы передать его представлению бритвы и отобразить таблицу. Буду признателен за любую помощь.

ViewModel:

public class ViewModel
    {
        public int TimeKey { get; set; }
        public int FiscsalYear { get; set; }
        public string LocationNum { get; set; }
        public string Location { get; set; }
    }

Просмотр:

@model List<FactWorkOrdersViewModel>
@{
    ViewBag.Title = "Stored Procedure Test";
}

<div class="container">
    <table class="table table-hover">
        <thead>
            <tr>
                <th colspan="5"><h3>Stored Procedures results</h3></th>

            </tr>
            <tr>
                <th>TimeKey</th>
                <th>Fiscal Year</th>
                <th>Location Number</th>
                <th>Location</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
            <tr>
                <td>
                    @item.TimeKey
                </td>
                <td>
                    @item.WorkOrderAltKey
                </td>
                <td>
                    @item.FiscsalYear
                </td>

                <td>
                    @item.LocationNum
                </td>
                <td>
                    @item.Location
                </td>

            </tr>
            }
        </tbody>
    </table>
<div>

Контроллер:

public IActionResult SPTest(ReportViewModel model)
    {
        DbConnection connection = db.Database.GetDbConnection();

            using (DbCommand cmd = connection.CreateCommand())
            {
                cmd.CommandText = "ExecuteReport";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@ReportId", model.ID));

                if (connection.State.Equals(ConnectionState.Closed))
                {
                    connection.Open();
                }

                var result = cmd.ExecuteScalar();

                //var result = cmd.ExecuteNonQuery();

                if (connection.State.Equals(ConnectionState.Open))
                {
                    connection.Close();
                }
                return View(result);

            }

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Я понял это, спасибо @ Amogh

public IActionResult SPTest(ReportViewModel model)
        {
            List<ViewModel> viewModel = new List<ViewModel>();

            using (SqlConnection conn = new SqlConnection("server=ServerName;database=DBName; user id=user_id; password=password; MultipleActiveResultSets=true"))
            {
                conn.Open();

                SqlCommand cmd = new SqlCommand("ExecuteReport", conn)
                {
                    CommandType = CommandType.StoredProcedure
                };

                cmd.Parameters.Add(new SqlParameter("@ReportId", model.ID));

                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        foreach (var item in rdr)
                        {
                            ViewModel vm = new ViewModel
                            {
                                TimeKey = (int)rdr.GetValue(0),
                                FiscsalYear = (int)rdr.GetValue(2),
                                LocationNum = (string)rdr.GetValue(5),
                                Location = (string)rdr.GetValue(6)
                            };

                            viewModel.Add(vm);
                        }
                    }
                }
            }

            return View(viewModel);
        }
0 голосов
/ 17 марта 2020

Это возможный дубликат. Пожалуйста, обратитесь к В чем разница между ExecuteScalar, ExecuteReader и ExecuteNonQuery? для получения дополнительной информации.

Краткий ответ: вам нужен ExecuteReader, а не ExecuteScalar. ExecuteScalar возвращает значение первого столбца первой строки. ExecuteReader вернет список строк, которые мы можем перебрать и отобразить на вашей странице.

...