четверг, 3 декабря 2009 г.

Java с высоты .Net или наоборот.Глава 2. DotNet технологии. Ado.Net

DotNet технологии доступа к БД

.Net богат технологиями, и ТДБД тоже. Итак начнем с не ORM, тем более что у .Net я знаком лишь с одним представителем не ORM, а именно ADO.Net.


ADO.Net

Основной принцип Ado.Net это использование отсоединенных таблиц и пакетная обработка данных. Т.е. мы работаем в памяти с данными из БД, а потом за один раз сохраняем все изменения. Такой подход описывается паттерном Unit Of Work.



Основной объект Ado.Net для хранения отсоединенных данных это DataSet, который представляет собой отображение в памяти всей вашей БД, с таблицами и связями между таблицами. Соответственно таблицы представлены объектами класса DataTable, а связи представлены классом DataRelation. Далее ваша таблица хранит внутри себя информацию о колонках через коллекцию объектов DataColumn, ограничениях накладываемых на таблицу -Constraint, и непосредственно записей DataRow.

Так как DataSet это отображения в памяти вашей БД, то требуется какой то объект, который умел бы работать с БД, выполнять SQL запросы и записывать данные в DataTable. Все это есть. Для создания соединения к БД используется класс Connection, который содержит внутри себя транзакции Transaction. Далее есть класс DataAdapter, который умеет работать с вашими таблицами, и является связующим звеном между сервером БД и вашим представлением БД в памяти. Для выполнения запросов используется тип Command, позволяющий описывать запросы к БД, умеющий работать с параметрами Parameter и умеющий считывать полученный результат через DataReader.

Принцип работы очень простой. Сначала вы создаете DataSet, студия позволяет создавать DataSet в дизайнере. Для этого надо добавить в сборку Item типа DataSet. Далее вы можете в этом дизайнере создать свои DataTable и создать для них DataAdapter'ы. В итоге вы получите какую то модель Ado.Net, т.е. набор DataTable и внутри каждой из них набор DataColumn, которые будут тbпизированны, т.е. вы создаете типизированный DataSet. Что это означает? Это означает что вы на этапе разработки DataSet'a, говорите какого типа данные будут в нем лежать, и описываете структуры данных, связи между таблицами и т.д. Что это дает? Это дает удобство разработки, у вас есть удобный IntelliSence, т.к. вы точно знаете какие данные вы будете хранить в памяти, убирает проблемы с приведением типов и т.п. В общем все плюсы от работы с типизированными объектами.

Но с моей точки зрения, основная сила Ado.Net именно в возможности работы с нетипизированными таблицами и данными. Т.е. в процессе работы приложения, вы строите свою модель DataSet'а, т.е. делаете это в Runtime, что позволяет сделать ваше приложение более гибким, особенно если вы используете какие то метаданные. Но в принципе, Ado.Net обладает несколькими утилитами, упрощающим вам работу с нетипизированными таблицами. Т.е. если вы на этапе разработки не знаете с какими таблицами БД будет работать ваше приложение, вам надо будет как то генерировать запросы для операций вставки, обновления, удаления данных. Для того что бы этого не делать есть класс умеющий создавать SQL запросы на основе DataAdapter, класс называется CommandBuilder.

Рассмотрим пример работы с CommandBuilder'ом.
Есть у нас таблица:



Я хочу просмотреть данные и что то добавить. Как это делать?

public partial class Form1 : Form
  {
    SqlDataAdapter adapter;
    DataTable testTable;
    SqlConnection connection;

    public Form1()
    {
      InitializeComponent();

      testTable = new DataTable(); //Создаем таблицу
      testTable.Columns.Add(new DataColumn("Id", typeof(int))); //Добавляем поля
      testTable.Columns.Add(new DataColumn("Name", typeof(string)));

      connection = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=TEstDB;Integrated Security=True"); // создаем подключение

      adapter = new SqlDataAdapter("select Id, Name from TestTable", connection); //Создаем DataAdapter

      SqlCommandBuilder buidler = new SqlCommandBuilder(adapter);//Создаем CommandBuilder

      adapter.Fill(testTable);// Заполняем таблицу

      dataGridView1.AutoGenerateColumns = true; //Грид для отображения настраиваю
      dataGridView1.DataSource = testTable;//биндю таблицу в GridView

      connection.Close();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      adapter.Update(testTable);//Делаю пакетное обновление данных при нажатии на кнопку на форме
      connection.Close();
    }
  }


* This source code was highlighted with Source Code Highlighter.


Таким образом я создал соединение с БД, создал таблицу, описал ее и создал адаптер данных который мне позволил работать с сервером БД. Вы видите что тут я использую конкретные типы для MS SqlServer, которые являются наследниками базовых типов, но в этих типах реализованна конкретно работа с MS SqlServer. Благодаря этому наследованию, вы можете писать ваше приложение без зависимости от БД.

Пакетная обработка данных работает благодаря тому, что у каждой DataRow есть метка о том была ли она изменена, удалена или создана, далее DataAdapter берет из DataTable все измененные записи и для конкретного изменения выполняет свой запрос с передачей параметров.

Также .Net поддерживает двунаправленный биндинг DataTable практически во все контролы поддерживающих биндинг. Т.е. в примере я забиндил мою таблицу в контрол DataGridView, данные отобразились, и любые изменения сделанные в DataGridVIew будут переданы в DataTable, что в последствии мне позволяет делать Update у адаптера.

Ado.Net прекрасно работает как в Web так и в Win приложениях. Биндинг поддерживается как Web так и Win контролов. Единственное на что стоит обратить внимание, это правильное использование отсоединенных таблиц в Web приложениях. И подумать, стоит ли использовать пакетную обработку данных.

Комментариев нет:

Отправить комментарий