在没有ORM的情况下使用ASP.NET MVC
-
03-07-2019 - |
题
在我的ASP MVC应用程序中,我使用标准SQL(而不是Linq to SQL或其他ORM)来查询我的数据库。
我想将数据库结果传递给我的视图,并在我的视图中迭代结果。但我不知道该怎么做。我见过的每个例子都传递了一些字符串或使用了L2S。我想传递类似嵌套的Hashtables,但我唯一能想到的是将SqlDataReader对象传递给视图,但这听起来真的很糟糕。
如何将标准SQL查询的数据库结果显示到我的视图中?我真的很想使用Linq或其他ORM,但要求我们不要求(不要问我为什么,我不明白)。我在VB中这样做。我将尽力转换所提供的任何C#示例。
解决方案
您可以为要传输的数据创建简单类,然后手动从数据读取器填充控制器中的对象列表,然后将其传递给您的视图 - 例如(C#但这应该很容易转换)
// open your connection / datareader etc.
List<Customer> customers = new List<Customer>();
while(dataReader.Read())
{
Customer c = new Customer();
c.Id = dataReader.GetInt32(0);
c.Name = dataReader.GetString(1);
// etc (you might want to use string indexers instead of ints for the get methods)
customers.Add(c);
}
// close and dispose your datareader / connection etc as usual
return View("List", customers);
其他提示
MVC是关于关注点的分离。将SqlDataReaders,DataTables或驻留在System.Data命名空间中的任何类传递给视图并不是一个好主意。您需要定义可能与数据库通信的模型,以及将此模型传递给视图的控制器。如果您的公司政策说不使用ORM,那么经典WebForms可能比MVC模式更适合您的场景。
我同意Rashack的观点。本文将详细解释它。链接文本
简而言之,以下是使用DataTable和DataReader的方法:
private DataTable GetData()
{
DataTable dt = new DataTable();
using (SqlConnection connection
= new SqlConnection("ConnectionString"))
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandText = "SELECT * FROM Customers";
connection.Open();
using (SqlDataReader reader =
command.ExecuteReader
(CommandBehavior.CloseConnection))
{
dt.Load(reader);
}
}
return dt;
}
然后,您可以将DataTable读入您传递的实体对象。
我认为你会发现这可以比使用Linq或ORM产生更好的性能。
尝试使用DataTables - DataTable可以从IDataReader加载数据......(我认为该方法称为Load)
不隶属于 StackOverflow