Leggera alternativa di sola lettura a DataTable per la memorizzazione di dati da SqlDataReader?

StackOverflow https://stackoverflow.com/questions/1811870

  •  06-07-2019
  •  | 
  •  

Domanda

Sto usando SqlDataReader per leggere i dati da SQL Server. Tuttavia a volte desidero memorizzare nella cache i miei dati in memoria come oggetto di sola lettura leggero e privo di connessioni . Non ho trovato alcuna opzione per me nel BCL. Devo scrivere la mia implementazione di tale contenitore o sono disponibili?

Quali alternative ho per l'archiviazione dei dati dal database in forma leggera? Per me DataTable non è affatto un candidato.

EDIT:

Quando so quali dati sto selezionando, posso facilmente usare LINQ per trasformare il mio lettore in List<T> o qualcosa del genere. Ma invece vorrei essere in grado di memorizzare nella cache dati di cui non conosco la struttura.

È stato utile?

Soluzione

List<object[]>

sembra il più leggero possibile.

E se vuoi più funzionalità che offra (come nomi di colonne, supporto di database, ordinamento, filtro), puoi derivare / incapsulare e aggiungere quella funzionalità.

Il tuo requisito è piuttosto vago. Cosa significa leggerezza? Cosa non è adatto a DataTable? Quali funzionalità fornite da DataTable sono necessarie?

Altri suggerimenti

Crea la tua struttura dati.

Il BCL non dovrebbe essere tutto per tutti. Si compone di blocchi. Il BCL contiene gli elementi costitutivi necessari per creare la propria struttura di dati.

Se il BCL contenesse soluzioni per ogni problema sarebbe un casino gonfio. Non tutte le funzionalità dovrebbero essere disponibili & Quot; off the shelf & Quot; altrimenti non rimarrebbe alcun valore da aggiungere come programmatore.

Sembra che tu abbia requisiti abbastanza chiari che sono diversi da " normale " modelli di utilizzo. Tra DataSet e ORM, la grande maggioranza dei progetti va d'accordo senza la funzionalità richiesta dai tuoi requisiti.

Puoi usare List<Dictionary<String, Object>>, dove la chiave del dizionario è il nome della colonna e il valore è il valore della cella.

Se hai molte righe, puoi separare i nomi delle colonne in List<String> e i valori List<List<Object>> (o Array).

La scelta migliore sarebbe quella di avere un tipo che rappresenti le colonne di dati, quindi costruire un'istanza di quella classe per ogni riga, riempire le sue proprietà con i valori del lettore e archiviare le istanze in List<YourClass> struttura.

Qualcosa del tipo:

using(SqlDataReader rdr = sqlCommand.ExecuteReader())
{
    List<YourClass> resultList = new List<YourClass>();

    while(rdr.Read())
    {
         YourClass work = new YourClass();

         // set the properties        
         work.Property1 = rdr["Column1"].Value;
         .....
         work.PropertyN = rdr["ColumnN"].Value;

         resultList.Add(work);
    } 
} 

Questo è fondamentalmente ciò che fa qualsiasi ORM (mappatore relazionale di oggetti): leggere i dati dal database usando il modo più veloce possibile (DataReader) e costruire oggetti .NET da esso.

Marc

Usa questo:

List<string> Variable1 = new List<string>();
//Do something with the generic

string[] MyArray = Variable1.ToArray();

Questo è l'obj leggero ed efficiente da salvare in memoria.

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