2009-05-03 11 views
9

In meiner ASP MVC-Anwendung verwende ich Standard-SQL (lieber als Linq zu SQL oder anderen ORM), um meine Datenbank abzufragen.Verwenden von ASP.NET MVC ohne ORM

Ich möchte die Datenbankergebnisse meiner Ansicht übergeben und über die Ergebnisse aus meiner Sicht iterieren. Aber ich bin mir nicht sicher, wie ich das machen soll. Jedes Beispiel, das ich gesehen habe, übergibt eine Zeichenfolge oder verwendet L2S. Ich möchte etwas wie verschachtelte Hashtables weitergeben, aber das Einzige, was mir einfällt, ist, ein SqlDataReader-Objekt an die View zu übergeben, aber das klingt nach einer wirklich schlechten Idee.

Wie würde ich meine Datenbankergebnisse aus einer Standard-SQL-Abfrage für meine Ansicht anzeigen? Ich würde wirklich gerne Linq oder andere ORM verwenden, aber Anforderungen diktieren wir nicht (frag mich nicht warum, ich verstehe nicht). Ich mache das in VB. Ich werde versuchen, alle vorhandenen C# -Beispiele zu konvertieren.

+4

Es ist nicht gut, eine requirment erfüllen Sie „nicht verstehen“, schlage ich vor, Sie gehen zurück auf die jemals die Forderung ist imposant und eine expliantion bekommen. – AnthonyWJones

+3

Anthony, in einigen Unternehmen gibt es Architekten, die diese Entscheidungen treffen, und es ist nicht immer eine gute Idee, sie zu hinterfragen. Sie entscheiden, Sie codieren. – DOK

+2

@DOK: Jeder Architekt, der es wert ist zu zahlen, würde lieber Programmierer ihre Entwürfe verstehen. Wenn das nicht so ist, wo Sie seine Zeit sind, Ihren Lebenslauf zu verstauben. – AnthonyWJones

Antwort

11

Sie können einfache Klassen für die Daten erstellen, die Sie übertragen möchten, und dann manuell eine Liste von Objekten in Ihrem Controller aus einem Datenlesegerät auffüllen und diese dann an Ihre View übergeben - z. (C#, aber dies sollte einfach zu konvertieren)

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

Mit anderen Worten, rollen Sie Ihr eigenes ORM :). – Morph

4

Versuche Tables mit - Datentabelle Daten aus IDataReader laden kann ... (ich glaube, die genannten Load-Methode)

3

Sie könnten Ihre eigenen Data Transfer Object Klassen erstellen und Instanzen von ihnen bevölkern ADO.Net Code. Diese DTO-Klassen wären einfache POCO -Style-Klassen, die nur Eigenschaften get/set accessors enthalten, keine Methoden. Die Verwendung von POCO-Objekten ist den DataSets/DataTables wohl vorzuziehen, da sie leichtgewichtig sind (kein überflüssiger Zustand) und mit einer objektorientierten Perspektive intuitiver arbeiten.

+0

Kann nicht sehen, wie die Verwendung Ihrer eigenen DTOs viel von der Verwendung eines ORM unterscheidet, sicherlich, wenn es ein vernünftiges Argument zur Vermeidung von bestehenden ORM-Technologie wie LINQ gab (und ich bin nicht überzeugt gibt es) würde diese Einschränkung nicht auch für ein Eigenheim gelten? – AnthonyWJones

+0

Mit LINQ, ich nehme an, Sie meinen LINQ to SQL (LINQ selbst eine Reihe von Spracherweiterungen, die CLR-Sprachen abfragebasierte Logik hinzufügen, kein ORM)? Sie haben nicht erläutert, warum Ihre Anforderungen die Verwendung eines ORM wie LINQ to SQL verboten haben.Kommerzielle ORMs enthalten eine Vielzahl von Funktionen für den Umgang mit der objektrelationalen Impedanzfehlanpassung. LINQ to SQL verfolgt Änderungen am Objektstatus und konvertiert mit LINQ erstellte Abfragen in natives SQL. Das Auffüllen und Zurückgeben von DTOs aus den Ergebnissen einer Abfrage, die über ADO.NET ausgeführt wird, ist nur eine andere Methode der Übertragung von zurückgegebenen Datenmengen. – pmarflee

7

MVC ist über die Trennung von Bedenken. Es ist keine gute Idee, SqlDataReaders, DataTables oder jede Klasse, die sich in dem System.Data-Namespace befindet, in einer Ansicht zu übergeben. Sie müssen ein Modell definieren, das mit der Datenbank kommunizieren kann, und einen Controller, der dieses Modell an die Ansicht weitergibt. Wenn in Ihrer Unternehmensrichtlinie angegeben wird, dass kein ORM verwendet wird, sind klassische WebForms möglicherweise besser für Ihr Szenario geeignet als das MVC-Muster.

+3

Ich muss zustimmen. MVC erzwingt die Trennung der verschiedenen Schichten, weshalb es implementiert wird. Ich habe jedoch bereits verschiedene Implementierungen gesehen, bei denen der Zweck der Technologie ignoriert wird. Es ist leider eine Realität der Industrie, in der wir arbeiten. – BinaryMisfit

+1

Besser haben Modell Business-Logik bitten, mit der Datenbank zu sprechen. Modelle sollen nicht so intelligent sein. – User

7

Ich stimme Rashack zu. Dieser Artikel erklärt es in einigen Details. link text

Auf den Punkt gebracht, ist hier, wie es Datatable und Datareader verwendet tun:

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

Dann Sie, dass Datatable in eine Entitätsobjekt lesen können, die Sie rund um passieren.

Ich denke, Sie werden feststellen, dass dies viel bessere Leistung als mit Linq oder einem ORM ergeben kann.

+0

Danke. das ist schön zu wissen – MikeJ

Verwandte Themen