2009-05-03 31 views
9

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

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

¿Qué debo hacer 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 (no me preguntes por qué, no entiendo). Estoy haciendo esto en VB. Trataré de convertir todos los ejemplos de C# que se proporcionen.

+4

no es bueno para cumplir un requerimiento que "no entiende", le sugiero que vaya de nuevo a que siempre está imponiendo el requisito y obtener un expliantion. – AnthonyWJones

+3

Anthony, en algunas empresas hay arquitectos que toman estas decisiones, y no siempre es una buena idea cuestionarlas. Ellos deciden, tu código. – DOK

+2

@DOK: Cualquier arquitecto que valga la pena pagar prefiere que los codificadores entiendan sus diseños. Si no es así, dónde estás es el momento de desempolvar tu CV. – AnthonyWJones

Respuesta

11

Puede crear clases simples para los datos que desea transferir y luego completar manualmente una Lista de objetos en su controlador desde un lector de datos, y luego pasarlo a su Vista - por ej. (C#, pero esto debe 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); 
+3

En otras palabras, mueva su propio ORM :). – Morph

4

Intente utilizar tablas de datos - DataTable puede cargar datos de IDataReader ... (creo que se llama carga del método)

3

Se puede crear sus propias clases Data Transfer Object y poblar instancias de las mismas utilizando el código ADO.Net. Estas clases de DTO serían simples POCO-clases de estilo que solo contenían acceso de propiedad obtener/establecer, sin métodos. El uso de objetos POCO es posiblemente preferible a los DataSets/DataTables ya que son livianos (no tienen un estado superfluo) y son más intuitivos para trabajar desde una perspectiva orientada a objetos.

+0

No puedo ver cómo el uso de sus propios DTO difiere mucho de usar un ORM, seguramente si hubiera un argumento sensato para evitar la tecnología ORM existente como LINQ (y no estoy convencido existe) ¿esta restricción no se aplicaría también a una de cosecha propia? – AnthonyWJones

+0

Por LINQ, supongo que se refiere a LINQ to SQL (LINQ en sí mismo es un conjunto de extensiones de lenguaje que agregan lógica basada en consultas a los lenguajes CLR, no a un ORM). No ha explicado por qué sus requisitos le prohibieron usar un ORM como LINQ to SQL.Los ORM comerciales contienen un amplio conjunto de características para tratar el desajuste de impedancia relacional entre objetos. LINQ to SQL rastrea los cambios al estado del objeto y convierte las consultas compuestas utilizando LINQ en SQL nativo. Llenar y devolver DTO a partir de los resultados de una consulta ejecutada a través de ADO.NET es solo un método diferente de transferencia desde la devolución de conjuntos de datos. – pmarflee

7

MVC es sobre 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. Necesita definir un modelo que pueda hablar 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 se ajusten mejor a su escenario que el patrón MVC.

+3

Tengo que estar de acuerdo. Mvc fuerza la separación de varias capas, que es la razón para implementarlo. Sin embargo, ya he visto varias implementaciones donde se ignora el propósito de la tecnología. Desafortunadamente, es una realidad de la industria en la que trabajamos. – BinaryMisfit

+1

Es mejor que el modelo solicite la lógica comercial para hablar con la base de datos. Se supone que los modelos no son tan inteligentes. – User

7

Estoy de acuerdo con Rashack. Este artículo lo explica con cierto detalle. link text

En pocas palabras, aquí está cómo hacerlo utilizando DataReader y DataTable:

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; 
} 

Entonces, se puede leer que DataTable en un objeto entidad que se pasa alrededor.

Creo que encontrará que esto puede producir un rendimiento mucho mejor que el uso de Linq o un ORM.

+0

Gracias. esto es bueno saber – MikeJ

Cuestiones relacionadas