Pregunta

En mi aplicación ASP MVC estoy usando SQL estándar (en lugar de Linq to SQL u otro ORM) para consultar mi base de datos.

Me gustaría pasar los resultados de la base de datos a mi vista e iterar sobre los resultados en mi vista. Pero no estoy seguro de cómo hacer esto. Cada ejemplo que he visto pasa alguna cadena o usa L2S. Me gustaría pasar algo como Hashtables anidados, pero lo único que puedo pensar es pasar un objeto SqlDataReader a la vista, pero esto parece una muy mala idea.

¿Cómo hago para mostrar los resultados de mi base de datos de una consulta SQL estándar a mi vista? Realmente me gustaría usar Linq u otro ORM, pero los requisitos dictan que no lo hagamos (no me pregunten por qué, no entiendo). Estoy haciendo esto en VB. Haré todo lo posible para convertir cualquier ejemplo de C # proporcionado.

¿Fue útil?

Solución

Puede crear clases simples para los datos que desea transferir y luego llenar una Lista de objetos en su controlador desde un lector de datos manualmente, y luego pasar esto a su Vista, p. (C # pero esto debería ser fácil de convertir)

// 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);

Otros consejos

MVC se trata de la separación de preocupaciones. Pasar SqlDataReaders, DataTables o cualquier clase que resida en el espacio de nombres System.Data a una vista no es una buena idea. Debe definir un modelo que pueda comunicarse con la base de datos y un controlador que pasará este modelo a la vista. Si la política de su compañía dice que no use un ORM, tal vez los WebForms clásicos sean más adecuados para su escenario que el patrón MVC.

Estoy de acuerdo con Rashack. Este artículo lo explica con cierto detalle. texto del enlace

En pocas palabras, aquí le indicamos cómo hacerlo utilizando DataTable y 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;
}

Luego, puedes leer ese DataTable en un objeto de entidad que pases.

Creo que encontrará que esto puede producir un rendimiento mucho mejor que usar Linq o un ORM.

Intente usar DataTables: DataTable puede cargar datos de IDataReader ... (creo que el método se llama Load)

Puede crear sus propias Clases de objetos de transferencia de datos y llenar instancias de ellas utilizando ADO. Código de red Estas clases de DTO serían simples clases de POCO -style que solo contenían accesos para obtener / establecer propiedades, no metodos El uso de objetos POCO es posiblemente preferible a DataSets / DataTables ya que son livianos (sin estado superfluo) y son más intuitivos para trabajar desde una perspectiva orientada a objetos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top