如何解决Razor ASP.NET Core:为什么数据库连接状态在第一次加载时显示“正在连接”,然后在重新加载时成功连接到数据库?
我正在使用ASP.NET Core 3.1 MVC和Razor页面构建Web应用程序。
我是Razor页面的新手。
在运行应用程序时,会加载剃须刀页面,但“国家/地区”下拉列表为空。
在刷新/重新加载同一页面时,“国家/地区”下拉列表将填充数据库中的国家/地区列表。
在调试时,我发现第一次运行时,数据库连接状态显示为 “正在连接” ,并且引发的异常为 ”。“ 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 举报,一经查实,本站将立刻删除。