ASP.NET MVC Web App 从 MySQL 数据库获取不完整的数据
ASP.NET MVC Web App gets incomplete data from MySQL database
我刚刚开发了我的第一个 ASP.NET MVC 网络应用程序。该页面的主要功能是将来自数据库的所有数据查看到 table 中。我本地数据库中的数据存储是一个包含姓名、地址、phone 号码等联系信息的集合。我实际上能够检索数据并在我的索引页面上的 table 中查看它。但是,上面有一些缺失的数据。
这是我的 table 的样子:
这是我的实际数据库:
[
这是我的联系人模型:
public class Contacts
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string State { get; set; }
public string Country { get; set; }
public int ZipCode { get; set; }
public string PhoneNumber { get; set; }
public string Notes { get; set; }
}
对于我的控制器,这是我所做的:
public class HomeController : Controller
{
public ActionResult Index()
{
var data = SQLDataAccess.GetContacts();
List<Contacts> contacts = new List<Contacts>();
foreach (var item in data)
{
contacts.Add(new Contacts
{
FirstName = item.FirstName,
LastName = item.LastName,
Address = item.Address,
State = item.State,
Country = item.Country,
ZipCode = item.ZipCode,
PhoneNumber = item.PhoneNumber,
Notes = item.Notes
});
}
return View(contacts);
}
}
SQLDataAccess 看起来像这样:
public static class SQLDataAccess
{
public static List<T> GetData<T>(string sql)
{
using (MySqlConnection connect = new MySqlConnection("Data Source=localhost; port=3306; Database=testdb; UserId=root; password=123456"))
{
connect.Open();
return connect.Query<T>(sql).ToList();
}
}
public static List<Contacts> GetContacts()
{
string select = @"Select * from contacts;";
return GetData<Contacts>(select);
}
}
请在此处复制视图的 cshtml 代码。我希望这没关系。
@model IEnumerable<ContactsTable.Models.Contacts>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Refresh Table", "Index")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstName)
</th>
<th>
@Html.DisplayNameFor(model => model.LastName)
</th>
<th>
@Html.DisplayNameFor(model => model.Address)
</th>
<th>
@Html.DisplayNameFor(model => model.State)
</th>
<th>
@Html.DisplayNameFor(model => model.Country)
</th>
<th>
@Html.DisplayNameFor(model => model.ZipCode)
</th>
<th>
@Html.DisplayNameFor(model => model.PhoneNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.Notes)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Address)
</td>
<td>
@Html.DisplayFor(modelItem => item.State)
</td>
<td>
@Html.DisplayFor(modelItem => item.Country)
</td>
<td>
@Html.DisplayFor(modelItem => item.ZipCode)
</td>
<td>
@Html.DisplayFor(modelItem => item.PhoneNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.Notes)
</td>
</tr>
}
</table>
我在 SQLDataAccess class 下的 GetData() 函数的 return
行之前插入了这一行,并且能够通过断点检查是否检索了所有 3 个数据,但其余的的缺失数据为 NULL。
var test = connect.Query<T>(sql);
我尝试使用 gridview 并通过 DataBind 检索数据并且它有效,所有数据都已在 table 中成功查看。
谁能帮我理解为什么会这样?
任何帮助将不胜感激。
谢谢!
connect.Query(sql,commandType:CommandType.Text).ToList();
还有
string select = @"Select * 来自联系人";
[Display(Name="FirstName")]
public string first_name { get; set; }
[Display(Name="LastName")]
public string last_name{ get; set; }
[Display(Name="Address")]
public string address { get; set; }
[Display(Name="State")]
public string state { get; set; }
[Display(Name="ZipCode")]
public int zipCode { get; set; }
[Display(Name="PhoneNumber")]
public string phone_number { get; set;
我想您正在使用 Dapper 检索数据并将其放入 class。在这种情况下,您应该知道 dapper 会自动将字段名称映射到具有相同名称的 class 的 属性 名称。您缺少的字段中都有一个 _,因此 dapper 无法将这些值传输到您的属性中。
一个不涉及重命名 class 属性以匹配数据库字段名称或重命名字段名称以匹配 属性 名称或使用映射代码的简单解决方案是以下
public static List<Contacts> GetContacts()
{
string select = @"select id, first_name as FirstName, last_name as LastName
address, state, country, zip_code as zipcode,
phone_number as phonenumber, notes
from contacts";
return GetData<Contacts>(select);
}
通过这种方式,每个不同的字段名称都有别名以匹配 属性 名称,Dapper 应该能够完全填充您的 class 实例。
我刚刚开发了我的第一个 ASP.NET MVC 网络应用程序。该页面的主要功能是将来自数据库的所有数据查看到 table 中。我本地数据库中的数据存储是一个包含姓名、地址、phone 号码等联系信息的集合。我实际上能够检索数据并在我的索引页面上的 table 中查看它。但是,上面有一些缺失的数据。
这是我的 table 的样子:
这是我的实际数据库:
[
这是我的联系人模型:
public class Contacts
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string State { get; set; }
public string Country { get; set; }
public int ZipCode { get; set; }
public string PhoneNumber { get; set; }
public string Notes { get; set; }
}
对于我的控制器,这是我所做的:
public class HomeController : Controller
{
public ActionResult Index()
{
var data = SQLDataAccess.GetContacts();
List<Contacts> contacts = new List<Contacts>();
foreach (var item in data)
{
contacts.Add(new Contacts
{
FirstName = item.FirstName,
LastName = item.LastName,
Address = item.Address,
State = item.State,
Country = item.Country,
ZipCode = item.ZipCode,
PhoneNumber = item.PhoneNumber,
Notes = item.Notes
});
}
return View(contacts);
}
}
SQLDataAccess 看起来像这样:
public static class SQLDataAccess
{
public static List<T> GetData<T>(string sql)
{
using (MySqlConnection connect = new MySqlConnection("Data Source=localhost; port=3306; Database=testdb; UserId=root; password=123456"))
{
connect.Open();
return connect.Query<T>(sql).ToList();
}
}
public static List<Contacts> GetContacts()
{
string select = @"Select * from contacts;";
return GetData<Contacts>(select);
}
}
请在此处复制视图的 cshtml 代码。我希望这没关系。
@model IEnumerable<ContactsTable.Models.Contacts>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Refresh Table", "Index")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstName)
</th>
<th>
@Html.DisplayNameFor(model => model.LastName)
</th>
<th>
@Html.DisplayNameFor(model => model.Address)
</th>
<th>
@Html.DisplayNameFor(model => model.State)
</th>
<th>
@Html.DisplayNameFor(model => model.Country)
</th>
<th>
@Html.DisplayNameFor(model => model.ZipCode)
</th>
<th>
@Html.DisplayNameFor(model => model.PhoneNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.Notes)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Address)
</td>
<td>
@Html.DisplayFor(modelItem => item.State)
</td>
<td>
@Html.DisplayFor(modelItem => item.Country)
</td>
<td>
@Html.DisplayFor(modelItem => item.ZipCode)
</td>
<td>
@Html.DisplayFor(modelItem => item.PhoneNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.Notes)
</td>
</tr>
}
</table>
我在 SQLDataAccess class 下的 GetData() 函数的 return
行之前插入了这一行,并且能够通过断点检查是否检索了所有 3 个数据,但其余的的缺失数据为 NULL。
var test = connect.Query<T>(sql);
我尝试使用 gridview 并通过 DataBind 检索数据并且它有效,所有数据都已在 table 中成功查看。
谁能帮我理解为什么会这样? 任何帮助将不胜感激。
谢谢!
connect.Query(sql,commandType:CommandType.Text).ToList();
还有 string select = @"Select * 来自联系人";
[Display(Name="FirstName")]
public string first_name { get; set; }
[Display(Name="LastName")]
public string last_name{ get; set; }
[Display(Name="Address")]
public string address { get; set; }
[Display(Name="State")]
public string state { get; set; }
[Display(Name="ZipCode")]
public int zipCode { get; set; }
[Display(Name="PhoneNumber")]
public string phone_number { get; set;
我想您正在使用 Dapper 检索数据并将其放入 class。在这种情况下,您应该知道 dapper 会自动将字段名称映射到具有相同名称的 class 的 属性 名称。您缺少的字段中都有一个 _,因此 dapper 无法将这些值传输到您的属性中。
一个不涉及重命名 class 属性以匹配数据库字段名称或重命名字段名称以匹配 属性 名称或使用映射代码的简单解决方案是以下
public static List<Contacts> GetContacts()
{
string select = @"select id, first_name as FirstName, last_name as LastName
address, state, country, zip_code as zipcode,
phone_number as phonenumber, notes
from contacts";
return GetData<Contacts>(select);
}
通过这种方式,每个不同的字段名称都有别名以匹配 属性 名称,Dapper 应该能够完全填充您的 class 实例。