Обробка даних із DataTable за допомогою об’єктів DataTableReader
Тип DataTable визначає значну кількість членів, багато з яких збігаються за іменами та функціями з аналогічними членами DataSet. Нижче наведено деякі основні члени типу DataTable, крім Rows та Columns:
CaseSensitive
Вказує, чи чутливі до регістру символів рядкові порівняння таблиці. За замовчуванням одно false
ChildRelations
Повертає колекцію дочірніх відносин для даного DataTable (якщо вони є)
Constraints
Отримує колекцію обмежень, що підтримуються даною таблицею
Copy()
Метод, що копіює схему та дані DataTable у новий екземпляр
DataSet
Отримує DataSet, що містить цю таблицю (якщо вона є)
DefaultView
Отримує спеціалізоване подання таблиці, яке може містити відфільтровану подання або позицію курсора
ParentRelations
Отримує колекцію батьківських стосунків для даного DataTable
PrimaryKey
Отримує або задає масив стовпців, які виступають як первинні ключі для таблиці даних
RemotingFormat
Дозволяє визначити формат серіалізації об'єктом DataSet його вмісту (двійковий або XML) для рівня .NET Remoting
TableName
Отримує або вказує ім'я таблиці. Значення цієї властивості можна також задати через параметр конструктора
Протягом нашого прикладу занесемо як PrimaryKey об'єкта DataTable об'єкт DataColumn на ім'я carIDColumn. Врахуйте, що властивості PrimaryKey відповідає колекції об'єктів DataColumn, щоб можна було обробляти ключі з кількох стовпців. Але в нашому випадку потрібно вказати тільки стовпець CarID (який знаходиться в таблиці в першійпозиції):
Тепер потрібно вставити в метод Main() виклик FillDataSet() і передати йому як аргумент локальний об'єкт DataSet. Потім передамо цей об'єкт новому допоміжному методу PrintDataSet (Метод PrintDataSet() просто перебирає всі метадані DataSet (використовуючи колекцію ExtendedProperties) і все DataTable у цьому DataSet, виводячи імена стовпців і значення рядків за допомогою індексаторів):
Якщо тепер запустити цю програму, буде отримано наступний результат (звичайно, з іншими відмітками часу та значенням GUID):

Обробка даних із DataTable за допомогою об'єктів DataTableReader
Згадайте вашу роботу у попередньому прикладі, і ви зрозумієте, що способи обробки даних за допомогою підключеного рівня (тобто за допомогою об'єктів читання даних) та автономного рівня (тобто за допомогою об'єктів DataSet) дуже різняться. Працюючи з об'єктом читання даних зазвичай пишеться цикл while, викликається метод Read(), і з допомогою індексатора вибираються пари имя/значение. А при обробці DataSet потрібен цілий ряд циклічних конструкцій, щоб дістатися даних, що знаходяться в таблицях, рядках і стовпцях (не забувайте, що для DataReader потрібне відкрите підключення до бази даних, щоб він міг прочитати дані з реальної бази).
Об'єкти DataTable підтримують методCreateDataReader(). Цей метод дозволяє отримувати дані з DataTable за допомогою схеми навігації, схожої на тип читання даних (об'єкт читання даних читає дані з таблиці DataTable, що знаходиться в пам'яті, а не з реальної бази даних, тому тут підключення до бази даних не потрібно). Основна перевага такого підходу полягає в тому, що при обробці даних використовується єдина модель, незалежно від рівня ADO.NET, що застосовується для отримання цих даних.Допустимо, до класу Program додано наступну допоміжну функцію на ім'я PrintTable():
Тип DataTableReader працює так само, як і об'єкт читання даних конкретного постачальника даних. Він дуже зручний, якщо потрібно швидко завантажити даними об'єкт DataTable, не плутаючись у внутрішніх колекціях рядків та стовпців. А тепер змінимо попередній метод PrintDataSet(), щоб у ньому застосовувалися виклики PrintTable(), а не перебір колекцій Rows та Columns:
Після запуску цієї програми ви побачите вихідні дані, що повністю збігаються з наведеними на малюнку вище. Єдиною відмінністю буде внутрішній доступ до вмісту DataTable.