Domanda

Nella mia applicazione ASP MVC sto usando SQL standard (piuttosto che Linq to SQL o altri ORM) per interrogare il mio database.

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. Vorrei passare qualcosa come Hashtables nidificati, ma l'unica cosa a cui riesco a pensare è passare un oggetto SqlDataReader alla vista, ma suona come una pessima idea.

Come potrei visualizzare i risultati del mio database da una query SQL standard alla mia vista? Vorrei davvero usare Linq o altri ORM, ma i requisiti ci impongono di non farlo (non chiedermi perché, non capisco). Lo sto facendo in VB. Farò del mio meglio per convertire qualsiasi esempio C # fornito.

È stato utile?

Soluzione

È possibile creare classi semplici per i dati che si desidera trasferire e quindi popolare manualmente un Elenco di oggetti nel controller da un lettore di dati, quindi passarlo alla vista, ad es. (C # ma 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);

Altri suggerimenti

MVC riguarda la separazione delle preoccupazioni. Passare SqlDataReaders, DataTables o qualsiasi altra classe che risiede nello spazio dei nomi System.Data a una vista non è una buona idea. È necessario definire un modello che potrebbe comunicare con il database e un controller che passerà questo modello alla vista. Se la tua politica aziendale dice di non utilizzare un ORM, forse i Web Form classici sono più adatti al tuo scenario rispetto al modello MVC.

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

In poche parole, ecco come farlo utilizzando DataTable e 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;
}

Quindi, puoi leggere quella DataTable in un oggetto entità che passi.

Penso che questo possa produrre prestazioni molto migliori rispetto all'utilizzo di Linq o di un ORM.

Prova ad usare DataTables - DataTable può caricare dati da IDataReader ... (Penso che il metodo si chiami Load)

Potresti creare le tue Data Transfer Object e popolarne istanze usando ADO. Codice netto. Queste classi DTO sarebbero semplici classi POCO che contenevano appena proprietà get / set accessors, no metodi. L'uso degli oggetti POCO è probabilmente preferibile ai DataSet / DataTables in quanto sono leggeri (nessuno stato superfluo) e sono più intuitivi per lavorare da una prospettiva orientata agli oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top