10

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

我想将数据库结果传递给我的视图并在我的视图中迭代结果。但我不知道该怎么做。我见过的每个示例都传递了一些字符串或使用 L2S。我想传递嵌套哈希表之类的东西,但我唯一能想到的是将 SqlDataReader 对象传递给视图,但这听起来是个非常糟糕的主意。

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

4

5 回答 5

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);
于 2009-05-03T19:19:56.190 回答
8

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

于 2009-05-03T19:19:08.437 回答
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;
}

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

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

于 2009-05-03T19:19:18.670 回答
5

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

于 2009-05-03T19:10:02.437 回答
4

您可以创建自己的数据传输对象类并使用 ADO.Net 代码填充它们的实例。这些 DTO 类将是简单的POCO风格的类,只包含属性获取/设置访问器,没有方法。使用 POCO 对象可以说比 DataSets/DataTables 更可取,因为它们是轻量级的(没有多余的状态)并且从面向对象的角度来看更直观。

于 2009-05-03T19:18:36.677 回答