微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Razor ASP.NET Core:为什么数据库连接状态在第一次加载时显示“正在连接”,然后在重新加载时成功连接到数据库?

如何解决Razor ASP.NET Core:为什么数据库连接状态在第一次加载时显示“正在连接”,然后在重新加载时成功连接到数据库?

我正在使用ASP.NET Core 3.1 MVC和Razor页面构建Web应用程序。

我是Razor页面的新手。

我创建了一个包含以下两个字段的注册页面-

  1. 用户名(控件类型-文本框)
  2. 用户国家(控件类型-下拉列表)

一个按钮-注册

在运行应用程序时,会加载剃须刀页面,但“国家/地区”下拉列表为

在刷新/重新加载同一页面时,“国家/地区”下拉列表将填充数据库中的国家/地区列表。

在调试时,我发现第一次运行时,数据库连接状态显示 “正在连接” ,并且引发的异常为 ”。“ ExecuteReader需要打开和可用的连接。连接的当前状态为正在连接“

刷新/重新加载同一页面时,数据库连接状态显示 “已连接” ,并且国家/地区下拉列表会获取值。

问题: 为什么数据库连接在第一次加载剃刀页面显示“正在连接”,然后同一页面在刷新/重新加载时成功连接到数据库

以下是代码段供参考:

Register.cshtml

        <div class="form-group row">
            <label asp-for="@Model.UserCountry" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <select asp-for="CountryId" asp-items="@Model.UserCountry">
                    <option value=""></option>
                </select>
                <span asp-validation-for="@Model.UserCountry" class="text-danger"></span>
            </div>
        </div>

Register.cshtml.cs

        //
        [BindProperty]
        public int CountryId { get; set; }


        //Model deFinition    
        [BindProperty]
        [required(ErrorMessage = "Country is required")]
        [display(Name = "Country")]
        public List<SelectListItem> UserCountry
        {
            get
            {
                return FillList();
            }
        }

        //FillList retrieves country list from database
        public List<SelectListItem> FillList()
        {
            var list = new List<SelectListItem>();
            DataTable dtTableResult = new DataTable();
            try
            {
                objappdbcont = new AppDbContext();
                objappdbcont.ConnectionString = _configuration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
                dtTableResult = objappdbcont.GetLists();
                    foreach (DaTarow row in dtTableResult.Rows)
                    {
                        list.Add(new SelectListItem { Value = row[0].ToString(),Text = row[1].ToString() });
                    }

            }
            catch (Exception ex)
            {
                list.Add(new SelectListItem { Value = "0",Text = ex.Message.ToString() });
            }

            return list;
        }

AppDBContect.cs

    public DataTable GetLists()
    {

        sqlDataAdapter myAdapter = new sqlDataAdapter();
        DataSet myDataset = new DataSet();
        sqlDataReader myDataReader;
        DataTable dtTableResult = new DataTable();
        string strConnString = "";
        string storedprocname = "spGetCountries";
        
        try
        {
            strConnString = ConnectionString;

            using (sqlConnection connSrc1 = new sqlConnection(strConnString))
            {
                using (sqlCommand command = new sqlCommand())
                {
                    myAdapter = new System.Data.sqlClient.sqlDataAdapter();
                    command.Connection = connSrc1;
                    command.CommandType = CommandType.StoredProcedure;
                    command.CommandTimeout = 0;
                    command.CommandText = storedprocname;
                    connSrc1.OpenAsync();
                    myDataReader = command.ExecuteReader();
                    dtTableResult.Load(myDataReader);
                    connSrc1.disposeAsync();
                }
            }
        }
        catch (Exception ex)
        {
            var errmsg = ex.Message;
        }

        return dtTableResult;
    }

解决方法

使用 connSrc1.Open()和“ connSrc1.Dispose()”代替 connSrc1.OpenAsync()和“ connSrc1.DisposeAsync( )”分别在 GetLists() AppDBContect.cs 的功能。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。