Обработка на данни от DataTable с помощта на обекти DataTableReader

Типът DataTable дефинира значителен брой членове, много от които имат същото име и функция като техните двойници в DataSet. По-долу са някои от основните членове на типа DataTable, различни от редове и колони:

Регистър на буквите

Показва дали сравненията на низове в таблицата са чувствителни към малки и главни букви. По подразбиране е невярно

ChildRelations

Връща колекцията от дъщерни релации за дадената DataTable (ако има такива)

Ограничения

Получава колекцията от ограничения, поддържани от тази таблица

Копиране()

Метод, който копира схемата и данните на DataTable в нов екземпляр

Набор от данни

Получава DataSet, съдържащ дадената таблица (ако има такава)

Изглед по подразбиране

Получава специализиран изглед на таблицата, който може да съдържа филтриран изглед или позиция на курсора

ParentRelations

Получава колекцията от родителски връзки за тази DataTable

Първичен ключ

Получава или задава масив от колони, които действат като първични ключове за таблицата с данни

RemotingFormat

Позволява ви да определите как обект DataSet сериализира своето съдържание (двоичен или XML) към слоя .NET Remoting

Име на таблица

Получава или задава името на таблицата. Стойността на това свойство може да бъде зададена и чрез параметър на конструктора

За да продължим нашия пример, нека зададем свойството PrimaryKey на обекта DataTable на обект DataColumn с име carIDColumn. Имайте предвид, че свойството PrimaryKey е съпоставено към колекция от обекти DataColumn, така че да могат да се обработват ключове от множество колони. Но в нашия случай трябва да посочите само колоната CarID (която се намира в таблицата в първатапозиции):

Сега трябва да вмъкнем извикване на FillDataSet() в метода Main() и да му предадем локалния обект DataSet като аргумент. След това предаваме този обект на новия помощен метод PrintDataSet (Методът PrintDataSet() просто итерира през всички метаданни на DataSet (използвайки колекцията ExtendedProperties) и всички DataTables в този DataSet, извеждайки имената на колоните и стойностите на редовете с помощта на индексатори):

Ако стартирате тази програма сега, ще получите следния резултат (разбира се, с различен времеви печат и GUID стойност):

datatable

Обработка на данни от DataTable с помощта на обекти DataTableReader

Върнете се към работата си в предишния пример и ще разберете, че начинът, по който данните се обработват от свързания слой (т.е. четци на данни) и офлайн слоя (т.е. обекти DataSet) са доста различни. Когато работите с четец на данни, обикновено пишете цикъл while, извиквате метода Read() и използвате индексатора, за да изберете двойки име/стойност. И когато обработвате DataSet, имате нужда от цяла поредица от циклични конструкции, за да стигнете до данните, разположени в таблиците, редовете и колоните (не забравяйте, че DataReader се нуждае от отворена връзка с базата данни, така че да може да чете данни от истинската база данни).

Обектите DataTable поддържат методаCreateDataReader(). Този метод ви позволява да получавате данни от DataTable, като използвате схема за навигация, подобна на типа четец на данни (четецът на данни чете данни от DataTable в паметта, а не от реална база данни, така че тук не е необходима връзка с база данни). Основното предимство на този подход е, че сега се използва един модел при обработката на данни, независимо от ADO.NET слоя, използван за получаване на тези данни.Да приемем, че следната помощна функция, наречена PrintTable(), е добавена към класа Program:

Типът DataTableReader работи точно като четец на данни, специфичен за доставчика. Много е полезно, ако трябва бързо да заредите данни в обект DataTable, без да се обърквате от вътрешните колекции от редове и колони. Сега нека променим предишния метод PrintDataSet(), за да използва извиквания на PrintTable(), вместо да итерира колекциите Rows и Columns:

След като стартирате това приложение, ще видите резултат, който е точно същият като показания на фигурата по-горе. Единствената разлика ще бъде вътрешният достъп до съдържанието на DataTable.