繁体   English   中英

无法从 Blazor 应用程序中的 Register.cshtml.cs 执行 SQL Server 存储过程

[英]Unable to execute a SQL Server stored procedure from Register.cshtml.cs in Blazor app

我在 SQL Server 数据库中有一个Players表,我试图在注册期间使用存储过程将它链接到AspNetUsers表。 但是,当我尝试调用该过程时,此变量 p 为空。 我是这种编码的新手,所以在回复时请记住这一点。

这是 Register.cshtml.cs 文件中变量 p 为 null 的部分 -

readonly PlayerInitClass p;

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
        returnUrl = returnUrl ?? Url.Content("~/");
        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

        if (ModelState.IsValid)
        {
            var user = new ApplicationIdentityUser { UserName = Input.Email, Email = Input.Email };
            var result = await _userManager.CreateAsync(user, Input.Password);
            int pID = await p.InitPlayerAsync(user);
        }
}

这是我创建的课程 -

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Scorekeeper.Data;

namespace Scorekeeper.Areas.Identity
{
    public class PlayerInitClass
    {
        private readonly ApplicationDbContext _db;

        public PlayerInitClass(ApplicationDbContext db)
        {
            _db = db;
        }

        public async Task<Int32> InitPlayerAsync(ApplicationIdentityUser user)
        {
            int AspNetUserId = user.Id;

            SqlParameter[] @params =
            {
              new SqlParameter("@returnVal", SqlDbType.Int) {Direction = ParameterDirection.Output},
              new SqlParameter("@AspNetUserId", SqlDbType.Int) {Direction = ParameterDirection.Input, Value = AspNetUserId},
          };

            await _db.Database.ExecuteSqlRawAsync("EXEC @returnVal=[dbo].[InitializeNewRegistrationPlayer] @AspNetUserId", @params);

            int result = Convert.ToInt32(@params[0].Value);

            await Task.FromResult(result);
            return result;
        }
    }
}

这是我看到的有关字段 p 为空的警告消息。

在此处输入图像描述

我最终找到了一种不为空的方法。 正如您可能已经知道的那样,我是一个新手,正在盲目地跌跌撞撞地解决这个问题。 话虽这么说,但我不愿意说这是问题的“正确”答案。 另外,即使我让它不为空,它现在也会抛出一个不同的错误。 如果我无法弄清楚,我会发布一个单独的问题。

这是我将 PlayerInitClass 更改为:

public class PlayerInitClass : Microsoft.EntityFrameworkCore.DbContext
{
public PlayerInitClass()
{
    this.context = context;
}

public PlayerInitClass context { get; set; }

这就是我实例化它的方式(不确定这是否是正确的说法):

PlayerInitClass p = new PlayerInitClass();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM