ASP.NET CORE: передача результата хранимой процедуры в раскрывающийся список - PullRequest
0 голосов
/ 12 марта 2019

Я использую страницы ASP.NET Core и Razor. Я использовал модель ADO.NET для получения данных из хранимой процедуры. Я не уверен, как передать эти данные результата в раскрывающийся список. Я пытаюсь на основе учебника, доступного в https://www.learnentityframeworkcore.com/raw-sql#database.executesqlcommand, и в этой последней части - Использование ADO.NET через свойство Context.Database.

Как передать результат хранимой процедуры, содержащей столбец "Desc", в раскрывающийся список.

Ниже приведен код

//index.cshtml
<select class="form-control" required multiple id="selLOB" asp-for="SelectedLOBs" asp-items="Model.LOBOptions"></select>

//index.cshtml.cs
public class IndexModel : PageModel
    {
        private readonly MyDbContext _dbContext;
        public IndexModel(MyDbContext dbContext)
        {
            _dbContext = dbContext;
        }
        public List<LOB> lOBs { get; set; } = new List<LOB>();

        [BindProperty]
        public string[] SelectedLOBs { get; set; }

        public SelectList LOBOptions { get; set; }

        public async Task OnGetAsync()
        {    
            using (var command = _dbContext.Database.GetDbConnection().CreateCommand())
            {
                command.CommandType = System.Data.CommandType.StoredProcedure;
                 await _dbContext.Database.ExecuteSqlCommandAsync("EXECUTE sp");
            }
        }
    }

// Model
 public class LOB
    {
         public string Desc { get; set; }       
    }

// Data
 public class MyDbContext : DbContext
    {
              public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
        {
        }
}

//startup.cs
  public void ConfigureServices(IServiceCollection services)
        {           
            services.AddMvc();
            ConnectionString = Configuration["TestConnectionString:DatabaseConnection"]; // Get Connection String from Appsetting.json
  services.AddDbContext<MyDbContext>(options =>
       options.UseSqlServer (ConnectionString));

        }

Попробовал этот новый код:

using (var command = _dbContext.Database.GetDbConnection().CreateCommand())
            {
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "sp";
                _dbContext.Database.OpenConnection();
                 using (var result = command.ExecuteReader())
                {
                    if (result.Read())
                    {
                        LOBOptions = new SelectList(result, "Desc");
                    }
                }
            }

но получено сообщение об ошибке как InvalidOperationException: недопустимая попытка вызвать FieldCount, когда читатель закрыт

Попробовал ниже код:

public async Task OnGetAsync()
        {                 
            using (var command = _dbContext.Database.GetDbConnection().CreateCommand())
            {
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "sp";
                _dbContext.Database.OpenConnection();

                using (var result = command.ExecuteReader())
                {
                    LOB lob = new LOB();
                    lob.Desc = Convert.ToString(result["Desc"]);
                    lOBs.Add(lob);
                    LOBOptions = new SelectList(lOBs, "Desc", "Desc");

                }
            }

        }

и получение ошибки в

lob.Desc = Convert.ToString(result["Desc"]);

1 Ответ

1 голос
/ 12 марта 2019

Чтобы заполнить раскрывающийся список в представлении, объект типа SelectList должен быть передан с сервера в представление.Это может быть передано либо в виде ViewBag, либо как часть модели.

Объект SelectList может быть создан путем заполнения данных из него из базы данных.Это то, что вы хотите сделать.

Вы просто следуете ответам, предложенным в комментариях, и вам также нужно прочитать об этом в MSDN.Вы также должны прочитать о ADO.NET тоже.

Тем не менее, следующий подход, который я предлагаю заполнить раскрывающийся список данными из базы данных.

Ниже приведен код моей хранимой процедуры.

CREATE PROCEDURE GetProductCategories
AS
BEGIN
    SELECT CategoryId, CategoryName FROM ProductCategory
END
GO

Ниже приводится мойкласс модели.

public class ProductModel
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int CategoryId { get; set; }

    public  SelectList Categories { get; set; }
}

Ниже описано, как выполнить хранимую процедуру из кода C # и заполнить Categories selectList в моем классе контроллера.

var connectionString = "connectionString";
var productModel = new ProductModel();

List<SelectListItem> listItems = new List<SelectListItem>();

using (var connection = new SqlConnection(connectionString))
{
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "GetProductCategories";
        command.CommandType = CommandType.StoredProcedure;
        connection.Open();

        var dataReader = command.ExecuteReader();

        while (dataReader.Read())
        {
            var item = new SelectListItem();
            item.Text = dataReader["CategoryName"].ToString();
            item.Value = dataReader["CategoryId"].ToString();
            listItems.Add(item);
        }
    }
}

productModel.Categories = new SelectList(listItems);
...