2009-11-28 3 views
1

Я использую SqlDataReader для чтения данных с SQL Server. Однако иногда я хочу кэшировать свои данные в памяти как доступный для чтения легкий без подключения объект. Я не мог найти никаких вариантов для меня в BCL. Нужно ли мне писать собственную реализацию такого контейнера или какие-либо доступные?Легкая альтернатива DataTable для хранения данных из SqlDataReader?

Какие альтернативы у меня есть для хранения данных из базы данных в облегченной форме? Для меня DataTable не является кандидатом вообще.

EDIT:

Когда я знаю, какие данные я выбор, я могу легко использовать LINQ для преобразования моего читателя в List<T> или что-то. Но вместо этого я хотел бы иметь возможность кэшировать данные, которые я не знаю о структуре.

ответ

3
List<object[]> 

кажется столь же легким, как вы можете получить.

И если вы хотите больше функциональности, которую он предлагает (например, имена столбцов, поддержка привязки данных, сортировка, фильтрация), вы можете получить/инкапсулировать и добавить эту функциональность.

Ваше требование довольно расплывчато. Что означает легкий вес? Что такое DataTable, что не подходит? Какая функциональность, предоставляемая DataTable, вам нужна?

+0

@Joe В легком я имею в виду не только использование памяти, но и скорость. Первоначальное тестирование показало, что DataTable работает медленнее, чем метод LINQ Execute . О списке решение - вы правы, я уверен, что могу сделать это, добавив к этому функциональность. Я просто хотел найти любую существующую реализацию в BCL, если таковая имеется. –

+0

Я очень не понимаю, что вы сравниваете, когда говорите о различиях в скорости между классом DataTable и методом Execute . – Joe

+0

@Joe DataTable.Load метод, который считывает из SqlDbReader vs LINQ Translate метод, который считывает из SqlDbReader и преобразует его в типизированный перечислимый. DataTable работает медленнее и больше. –

0

Лучшим выбором будет иметь тип, который представляет столбцы данных, а затем просто построить экземпляр этого класса для каждой строки, заполнить его свойства значениями из считывателя и сохранить экземпляры в структуре List<YourClass> ,

Что-то вроде:

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

Это в основном по своей сути, что любой ORM (объектно-реляционного отображения) делает - считывать данные из базы данных, используя наиболее быстрый путь (DataReader) и построить объекты .NET из Это.

Марк

+0

Когда я точно знаю, какие данные я возвращаю, это легко. Я ищу общий контейнер с такими функциональными возможностями, как DataTable, но не DataTable :) –

1

Создайте свою собственную структуру данных.

BCL не должен быть всем для всех людей. Он состоит из строительных блоков. BCL содержит строительные блоки, необходимые для создания собственной структуры данных.

Если бы BCL содержал решения для каждой проблемы, это был бы раздутый беспорядок. Не каждая функциональность должна быть доступна «с полки», иначе вам не оставалось бы никакой ценности, как добавить программиста.

У вас, кажется, достаточно четкие требования, отличные от «нормальных» шаблонов использования. Между DataSets и ORM большинство проектов прекрасно сочетаются с функциональностью, которой требуют ваши требования.

1

Вы можете использовать List<Dictionary<String, Object>>, где ключ словаря - это имя столбца, а значение - значение ячейки.

Если у вас много строк, вы можете разделить имена столбцов на List<String> и значения List<List<Object>> (или Array).

0

Используйте это:

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

string[] MyArray = Variable1.ToArray(); 

Это сусло легкий и эффективный OBJ, чтобы сохранить в памяти.

Смежные вопросы