在没有ORM的情况下使用ASP.NET MVC

Coo*_*tar 10 data-binding asp.net-mvc datatable datareader

在我的ASP MVC应用程序中,我使用标准SQL(而不是Linq to SQL或其他ORM)来查询我的数据库.

我想将数据库结果传递给我的视图,并在我的视图中迭代结果.但我不知道该怎么做.我见过的每个例子都会传递一些字符串或使用L2S.我想传递嵌套的Hashtables之类的东西,但我唯一能想到的是将SqlDataReader对象传递给视图,但这听起来真的很糟糕.

我如何将标准SQL查询的数据库结果显示到我的视图中?我真的很想使用Linq或其他ORM,但要求我们不要求(不要问我为什么,我不明白).我在VB中这样做.我会尽量转换所提供的任何C#示例.

Ste*_*ock 12

您可以为要传输的数据创建简单类,然后手动从数据读取器填充控制器中的对象列表,然后将其传递给您的视图 - 例如(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);
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,滚动你自己的ORM :). (3认同)

Dar*_*rov 8

MVC是关于关注点的分离.将SqlDataReaders,DataTables或驻留在System.Data命名空间中的任何类传递给视图并不是一个好主意.您需要定义可能与数据库通信的模型,以及将此模型传递给视图的控制器.如果您的公司政策说不使用ORM,那么经典WebForms可能比MVC模式更适合您的场景.

  • 我必须同意.Mvc强制分离各层,这是实现它的原因.但是,我已经看到了忽略该技术目的的各种实现.不幸的是,这是我们工作的行业的现实. (3认同)

DOK*_*DOK 8

我同意拉沙克的观点.本文将详细解释它.链接文字

简而言之,以下是使用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;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将DataTable读入您传递的实体对象中.

我想你会发现这可以比使用Linq或ORM产生更好的性能.


Ras*_*ack 5

尝试使用DataTables - DataTable可以从IDataReader加载数据...(我认为该方法称为Load)