Отправляет email-рассылки с помощью сервиса Sendsay

Килограмм килобайтов

  Все выпуски  

Килограмм килобайтов


"Килограмм килобайтов"


Выпуск №6 Дата выхода:2007-02-28
Сайт рассылки: отсутствует

Здравствуйте, уважаемые подписчики.


В этом выпуске я заканчиваю разбирать работу с базой данных Oracle из .Net.
В предыдущих выпускать мы рассмотрели как создавать соединение с базой, как извлекать из нее данные и выводить их на экран. При этом во главу угла ставилась максимальная скорость разработки приложения, возможно, со снижением производительности.
Ниже я покажу, как еще больше упростить разработку приложения для СУБД.

Предположим, что шаблон стандартного windows-приложения создан и перед вам готовая форма. Помещаем на эту форму объект DataGridView для вывода данных пользователю и две кнопки, одну - сохранение изменений DataGridView, другую для выборки данных из базы.
Рассмотрим код формы.


public partial class ReferencePrj : Form
{
  OracleDataAdapter    sRefPrjAdapter;
  OracleCommandBuilder sRefPrjCommandBuilder;
  DataSet              sRefPrjDataSet;
  //Конструртор формы
  public ReferencePrj()
  {
    InitializeComponent();
    Init();
    FillList();
  }
  //Инициализация "инфраструктурных классов"
  private void Init()
  {
    try
    {
      sRefPrjAdapter = new OracleDataAdapter("Select PrjType, PrjName, " +
                                             "PrjPriority from tPrjm_refrencePrj",
                                             "Data Source=" + "<имя базы>" +
                                             ";User Id="  + 
                                             "<имя пользователя>"    +
                                             ";Password=" + 
                                             "<пароль пользователя>"
                                            );
      sRefPrjCommandBuilder = new OracleCommandBuilder(sRefPrjAdapter);
      sRefPrjDataSet = new DataSet();
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.ToString());
    }
  }
  //Выборка из базы и вывод данных на экран
  private void FillList()
  {
    try
    {
      sRefPrjDataSet.Clear();
      sRefPrjAdapter.Fill(sRefPrjDataSet, "tPrjm_RefrencePrj");
      PrjList.DataSource = sRefPrjDataSet;
      PrjList.DataMember = "tPrjm_RefrencePrj";
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.ToString());
      }
    }
  //Обработка события нажатия на кнопку "Выборка из базы"
  private void select_but_Click(object sender, EventArgs e)
  {
    FillList();
  }
  //Обработка события нажатия на кнопку "Сохранить изменения в базу"
  private void commit_but_Click(object sender, EventArgs e)
  {
    sRefPrjAdapter.Update(sRefPrjDataSet,"tPrjm_RefrencePrj");
  }
} 

Классы OracleDataAdapter и DataSet я уже рассматривал. Обратите внимание на способ инициализации OracleDataAdapter, в этот раз объект соединения с базой данных не создается как самостоятельная единица. Строка соединения передается непосредственно в OracleDataAdapter.

Сейчас давайте разберемся с классом OracleCommandBuilder. Этот класс разработан для совместного использования с DataSet, его назначение - автоматическое формирование запросов к базе данных, для переноса изменений из DataSet в базу. Строчка
sRefPrjCommandBuilder = new OracleCommandBuilder(sRefPrjAdapter);
именно это и делает, т.е. создает набор запросов для отображения изменений в sRefPrjAdapter. OracleCommandBuilder умеет создавать запросы только для одной таблицы.
Обратите внимание еще на одну особенность автоматического формирования запросов. Если для таблицы не определен первичный ключ, то запрос delete не будет сформирован автоматически и его надо будет добавить вручную, определив свойство DeleteCommand, класс OracleDataAdapter. Если же таблица содержит первичный ключ (а как же иначе!), то автоматически созданный запрос insert не будет работать должным образом (откуда OracleCommandBuilder знает правило формирования ключа?). Вариант переложить задачу задания первичного ключа на плечи пользователя я не рассматриваю как реальную. Поэтому, надо предпринять дополнительные меры, описанные в статье "Automatically Generating Commands" MSDN или самому инициализировать свойство insert класса OracleDataAdapter, мне кажется, что это более правильное решение.

Остальная часть приведенного листинга интуитивно понятна и не требует пояснений. Связывание DataGridView источником данных я рассматривал раньше. А действие функции
sRefPrjAdapter.Update(sRefPrjDataSet,"tPrjm_RefrencePrj");
весьма прозрачно - это сохранение в базу, всего, что было изменено.

Используя средства автоматизации .Net можно очень быстро получить простейшее приложение для просмотра и редактирования содержимого базы данных. Фактически, описанное выше приложение создает в форме "зеркало" таблицы базы данных, все изменения в "зеркале" переносятся в базу. Однако, если говорить о нормальной работе с базой, то у автоматического подхода "по умолчанию" появляются существенные недостатки. Оптимальным видится использование класса OracleDataAdapter с ручным заданием команд update, insert, delete. Такой подход позволяет и ускорить разработку, избежав рутинных операций, и написать эффективные надежные запросы.


* * *

Ведущий рассылки: Петрелевич Сергей

Вас есть вопрос? Спрашивайте
Напишите, что Вы хотите видеть в рассылке. Мне важно знать Ваше мнение.


В избранное