2009-05-03 24 views
9

Nella mia applicazione ASP MVC sto usando SQL standard (piuttosto che Linq a SQL o altro ORM) per interrogare il mio database.Utilizzo di ASP.NET MVC senza un ORM

Vorrei passare i risultati del database alla mia vista e scorrere i risultati nella mia vista. Ma non sono sicuro di come farlo. Ogni esempio che ho visto passa qualche stringa o usa L2S. Mi piacerebbe passare qualcosa come Hashtables annidati, ma l'unica cosa che posso pensare è passare un oggetto SqlDataReader alla vista, ma questa mi sembra una pessima idea.

Come posso visualizzare i risultati del mio database da una query SQL standard alla mia vista? Mi piacerebbe molto usare Linq o altri ORM, ma i requisiti dettano che non lo facciamo (non chiedermi perché, non capisco). Lo sto facendo in VB. Cercherò di convertire tutti gli esempi C# forniti.

+4

La sua non buona per compiere un requirment te "non capisci", vi suggerisco di andare di nuovo a chi mai si impone l'esigenza e ottiene un expliantion. – AnthonyWJones

+3

Anthony, in alcune aziende ci sono architetti che prendono queste decisioni, e non è sempre una buona idea interrogarle. Decidono, codice. – DOK

+2

@DOK: qualsiasi architetto che valga la pena di pagare, preferirebbe che i programmatori capissero i loro progetti. Se non è così dove sei il momento di rispolverare il tuo CV. – AnthonyWJones

risposta

11

È possibile creare classi semplici per i dati che si desidera trasferire e quindi compilare manualmente un elenco di oggetti nel controller da un lettore di dati, quindi trasferirlo alla vista - ad es. (C#, ma questo dovrebbe essere facile da convertire)

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

In altre parole, tira il tuo ORM :). – Morph

4

Provare a utilizzare DataTable - DataTable può caricare dati da IDataReader ... (credo chiamato Load del metodo)

3

Si potrebbe creare le proprie classi Data Transfer Object e popolare istanze di loro utilizzando il codice ADO.Net. Queste classi DTO sarebbero semplici classi POCO che contenevano semplicemente proprietà get/set accessors, nessun metodo. L'utilizzo di oggetti POCO è probabilmente preferibile a DataSet/DataTables in quanto sono leggeri (non superflui) e sono più intuitivi da utilizzare con una prospettiva orientata agli oggetti.

+0

Non riesco a capire come utilizzare i tuoi DTO differisce molto dall'utilizzo di un ORM, sicuramente se ci fosse un argomento ragionevole per evitare la tecnologia ORM esistente come LINQ (e non sono convinto c'è) questa restrizione non si applicherebbe anche a quella domestica? – AnthonyWJones

+0

Con LINQ, suppongo si intenda LINQ to SQL (LINQ è di per sé un insieme di estensioni del linguaggio che aggiungono logica basata su query ai linguaggi CLR, non un ORM)? Non hai spiegato perché i tuoi requisiti ti hanno impedito di utilizzare un ORM come LINQ to SQL.Gli ORM commerciali contengono un ricco set di funzionalità per gestire il disadattamento di impedenza relazionale dell'oggetto. LINQ to SQL tiene traccia delle modifiche allo stato dell'oggetto e converte le query composte utilizzando LINQ in SQL nativo. Il compilare e restituire DTO dai risultati di una query eseguita tramite ADO.NET è solo un metodo diverso di trasferimento dalla restituzione dei set di dati. – pmarflee

7

MVC riguarda la separazione dei problemi. Passare SqlDataReaders, DataTables o qualsiasi altra classe che risiede nello spazio dei nomi System.Data in una vista non è una buona idea. È necessario definire un modello che possa comunicare con il database e un controller che trasmetterà questo modello alla vista. Se la tua politica aziendale dice che non usi un ORM, forse i classici WebForms sono più adatti al tuo scenario rispetto al pattern MVC.

+3

Devo essere d'accordo. Mvc forza la separazione dei vari strati, che è la ragione per implementarla. Tuttavia ho già visto varie implementazioni in cui lo scopo della tecnologia è ignorato. Sfortunatamente è una realtà del settore in cui lavoriamo. – BinaryMisfit

+1

È meglio che il modello chieda alla business logic di parlare con il database. I modelli non dovrebbero essere così intelligenti. – User

7

Sono d'accordo con Rashack. Questo articolo lo spiega in dettaglio. link text

In poche parole, ecco come farlo utilizzando DataReader DataTable e:

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

Poi, si può leggere che DataTable in un oggetto entità che si passa in giro.

Penso che troverete che questo può fornire prestazioni molto migliori rispetto all'utilizzo di Linq o di un ORM.

+0

Grazie. questo è bello sapere – MikeJ

Problemi correlati