Заповнення dataset з dataadapter ()

Набір даних ADO.NET DataSet є перебувають в оперативній пам'яті поданням даних, що забезпечує узгоджену реляционную програмну модель, незалежну від джерела даних. Набір даних DataSet представляє собою повну сукупність даних, яка включає таблиці, обмеження і зв'язку між таблицями. Набір даних DataSet є незалежним від джерела даних, тому DataSet може включати дані, локальні по відношенню до додатка, а також дані з декількох джерел даних. Управління взаємодією з існуючими джерелами даних здійснюється за допомогою DataAdapter.







Метод Fill об'єкта DataAdapter служить для заповнення набору даних DataSet результатами виконання методу SelectCommand об'єкта DataAdapter. Метод Fill приймає в якості аргументу підлягає заповненню набір даних DataSet. а також об'єкт DataTable або ім'я об'єкта DataTable. який повинен бути заповнений рядками, повернутими методом SelectCommand.

Використання DataAdapter для отримання всієї таблиці вимагає часу, особливо при наявності в ній великої кількості рядків. Це відбувається внаслідок того, що звернення до бази даних, виявлення та обробка даних, а також передача даних клієнта займають тривалий час. Передача на запит всій таблиці клієнту призводить також до блокування всіх рядків на сервері. Для підвищення продуктивності можна використовувати пропозицію WHERE. що дозволяє значно зменшити кількість рядків, що повертаються клієнту. Можна також зменшити кількість даних, що повертаються клієнту, за допомогою явно заданого списку необхідних стовпців в інструкції SELECT. Ще одним хорошим рішенням проблеми є отримання рядків в пакетах (наприклад, що містять кілька сотень рядків одночасно), а також отримання наступного пакета тільки після завершення обробки поточного.

Метод Fill неявно використовує об'єкт DataReader для повернення імен і типів стовпців, які використовуються для створення таблиць в DataSet. і даних для заповнення рядків таблиць в DataSet. Таблиці та стовпці створюються тільки в тому випадку, якщо вони ще не існують. В іншому випадку метод Fill використовує існуючу схему DataSet. Типи стовпців створюються у вигляді типів платформи .NET Framework відповідно до таблиць в Зіставлення типів даних в ADO.NET. Первинні ключі створюються, тільки якщо вони існують в джерелі даних і властивість DataAdapter. MissingSchemaAction має значення MissingSchemaAction. AddWithKey. Якщо Fill виявляє, що для таблиці існує первинний ключ, то дані в DataSet для рядків, в яких значення стовпців первинного ключа збігаються зі значеннями в рядках, повернутих з джерела даних, будуть перезаписані даними з джерела даних. Якщо первинний ключ не знайдений, то дані додаються в таблиці DataSet. У методі Fill при заповненні DataSet використовуються всі існуючі зіставлення (див. В розділі Зіставлення DataAdapter, DataTable і DataColumn (ADO.NET)).

Якщо SelectCommand повертає результати OUTER JOIN, то DataAdapter не ставить значення PrimaryKey для результуючого об'єкта DataTable. Щоб забезпечити правильне виявлення повторюваних рядків, користувач повинен визначити первинний ключ, PrimaryKey. Додаткові відомості див. У розділі Визначення первинних ключів (ADO.NET).

У наступному прикладі коду створюється екземпляр SqlDataAdapter. в якому використовується з'єднання SqlConnection для бази даних Northwind Microsoft SQL Server і заповнюється DataTable в наборі даних DataSet списком клієнтів. Інструкція SQL і аргументи SqlConnection. передані в конструктор SqlDataAdapter. використовуються для створення властивості SelectCommand об'єкта SqlDataAdapter.







Код, показаний в даному прикладі, не розкриває і не закриває Connection явно. Якщо з'єднання ще не відкрито, то метод Fill неявно відкриває Connection. яке використовується DataAdapter. Якщо операція Fill відкрила з'єднання, вона також закриває його при завершенні Fill. Це дозволяє спростити код при використанні окремої операції, такий як Fill або Update. Однак при виконанні декількох операцій, які потребують відкритого з'єднання, можна підвищити продуктивність програми шляхом явного виклику методу Open об'єкту Connection. виконання операцій з джерелом даних і подальшого виклику методу Close об'єкта Connection. Необхідно зберігати з'єднання з джерелом даних лише на такий короткий час, наскільки це можливо, звільняючи ресурси для використання іншими клієнтськими додатками.

Якщо об'єкт DataAdapter виявляє кілька результуючих наборів, то створює кілька таблиць в DataSet. Таблиці отримують додатковий ім'я за замовчуванням TableN. для Table0 починається з «Table». Якщо ім'я таблиці передається в якості аргументу методу Fill. то таблиці отримують за замовчуванням ім'я TableNameN з послідовно збільшується суфіксом, але починаючи з «TableName», а не з TableName0.

Передбачена можливість використовувати з об'єктом DataAdapter будь-яку кількість наборів даних DataSet. Кожен об'єкт DataAdapter може використовуватися для заповнення одного або більше об'єктів DataTable і дозволу оновлень у відповідному джерелі даних. Об'єкти DataRelation і Constraint можуть бути додані до DataSet локально, що дозволяє пов'язувати дані з різнорідних джерел даних. Наприклад, DataSet може містити дані з бази даних Microsoft SQL Server, з бази даних IBM DB2, доступ до якої надається за допомогою OLE DB, і джерела даних, призначеного для отримання XML-даних у вигляді потоку. Один або кілька об'єктів DataAdapter можуть обробляти з'єднання з кожним джерелом даних.

За замовчуванням DataSet зберігає дані за допомогою типів даних платформи .NET Framework. Для більшості додатків завдяки цьому з'являється зручний спосіб подання відомостей про джерело даних. Однак дане подання може викликати проблему, якщо типом даних в джерелі даних є застосовуваний в SQL Server тип decimal або numeric. Тип даних decimal платформи .NET Framework дозволяє використовувати максимум 28 значущих цифр, тоді як тип даних decimal SQL Server дозволяє використовувати 38 значущих цифр. Якщо під час операції Fill SqlDataAdapter визначає, що точність поля decimal SQL Server більше 28 символів, поточна рядок не додається в DataTable. Замість цього відбувається подія FillError. яке дозволяє визначити, чи відбудеться втрата точності, і вжити відповідних заходів. Додаткові відомості про подію FillError см. В розділі Обробка подій DataAdapter (ADO.NET). Для отримання значення типу decimal SQL Server можна також використовувати об'єкт SqlDataReader і викликати метод GetSqlDecimal.

У ADO.NET 2.0 з'явилася розширена підтримка System.Data.SqlTypes в DataSet. Додаткові відомості див. У розділі SqlTypes і DataSet (ADO.NET).

Ієрархічні набори рядків, або розділи (тип DBTYPE_HCHAPTER в OLE DB, тип adChapter в ADO), можуть використовуватися для заповнення вмісту DataSet. Коли OleDbDataAdapter під час операції Fill виявляє стовпець, розбитий на розділи, для цього стовпця створюється DataTable. дана таблиця заповнюється стовпцями і рядками з розділу. Таблиці, створеної для розбитого на розділи стовпчика, присвоюється ім'я, що складається з імені батьківської таблиці і імені розбитого на розділи стовпчика, в формі «ParentTableNameChapteredColumnName». Якщо в наборі даних DataSet вже міститься таблиця, ім'я якої узгоджується з ім'ям розбитого на розділи стовпчика, то даними розділу заповнюється поточна таблиця. Якщо в існуючій таблиці немає стовпчика, що збігається зі стовпцем, що містяться в розділі, то додається новий стовпець.

Перед заповненням таблиць в DataSet даними, що містяться в розбитих на розділи шпальтах, між батьківської та дочірньої таблицями ієрархічного набору рядків створюється зв'язок шляхом додавання целочисленного стовпчика до батьківської і дочірньою таблицями, установки батьківського стовпця на автопріращеніе і створення DataRelation за допомогою доданих з обох таблиць стовпців. Доданої зв'язку присвоюється ім'я з використанням імен батьківської таблиці і розбитого на розділи стовпчика у вигляді «ParentTableNameChapterColumnName».

Зверніть увагу, що пов'язаний стовпець існує тільки в DataSet. Подальше заповнення з джерела даних може викликати додавання до таблиць нових рядків замість внесення змін до існуючих рядки.

Зверніть увагу, що при використанні перевантаженого методу DataAdapter.Fill. який приймає DataTable як аргумент, заповнюється тільки ця таблиця. Цілочисельний стовпець з автопріращеніем все ще можна додати в таблицю, але не можна створити або заповнити дочірню таблицю, а також не можна створити зв'язок.

У наступному прикладі використовується постачальник MSDataShape для створення розбитого на розділи стовпця для кожного клієнта зі списку клієнтів. Після цього DataSet заповнюється даними.