在我的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)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top