Опубликован: 05.08.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 4:

Разработка приложений ADO.NET для OLE DB

Аннотация: Работа основана на материалах книги "Скотт Ф. Баркер. Создание приложений баз данных в среде Visual Basic .Net и ADO.Net: советы, рекомендации, примеры.: Пер. с англ. - М.: Издательский дом 'Вильямс', 2003. - 560 с.". Книга относительно старая, но весьма поучительная.

Все необходимые для выполнения данной работы программы можно найти в прилагаемом каталоге.

В этой работе мы последовательно познакомимся с технологией ADO.NET (ActiveX Data Objects) управления базами данных типа OLE DB (Object Linking and Embedding Database), к которым, в частности, относятся и базы файлового типа Microsoft Access с расширением .mdb. Наш выбор основан на том, что не требуется устанавливать дополнительные программы, типа SQL Server, для такого рода баз. Пока мы будем пользоваться готовой учебной базой данных Northwind.mdb, расположенной в прилагаемом к работе каталоге Source. Позднее мы научимся создавать свои базы данных либо с помощью СУБД Microsoft Office Access, либо с помощью COM объектов в оболочке Visual Studio 2008.

Создание базы данных начинается с ее проектирования с помощью диаграмм. Затем создается сам файл (или несколько взаимосвязанных файлов) БД и устанавливается структура БД, определяющая таблицы, поля и их типы, назначение ключей и индексов. Затем проектируется приложение, управляющее данными БД. Мы займемся разработкой приложения, решающего типовые задачи по редактированию и представлению данных БД.

Базы данных называют источниками данных. Microsoft ADO.NET - это часть библиотеки .NET Framework, позволяющая создавать приложения для управления данными в структурированных файловых или серверных хранилищах. Библиотечные средства ADO.NET обеспечивают подключение к источникам данных, выполнение команд SQL, обработку и выборку данных.

ADO.NET представлено набором программных средств, прежде всего классов, которые находятся в библиотечной сборке System.Data.dll. Применительно к формату OLE DB наиболее важными из них являются специализированные классы пространства имен System.Data.OleDb:

  • OleDbConnection - обоспечивает подключение к источнику данных
  • OleDbDataAdapter - обеспечивает связь между источником данных и набором данных в оперативной памяти
  • OleDbCommand - объект команд SQL для работы в источнике данных

В совокупности экземпляры этих классов в приложении называются поставщиком данных (Data Provider). Далее идет независимый от формата БД слой для хранения данных в кэше оперативной памяти и просмотра данных из пространства имен System.Data:

  • DataSet - набор кэшированных данных, выборочно загруженных из источника
  • DataView - позволяет создать несколько представлений одной и той же таблицы

Упражнение 1. Связывание данных с элементами управления ListBox и TextBox

Начнем с подготовительных действий и созданию связанного с данными списка, дающего возможность только просматривать данные БД.

  • Создайте новый проект типа Windows Forms Application с именем FormsADO и решением ADO

Замечание. Место расположения проекта в файловой системе компьютера выбирайте таким, чтобы путь к нему не содержал пробелов и кириллицы. Иначе могут возникнуть проблемы с работой некоторых мастеров Visual Studio 2008!
  • В палитре компонентов Toolbox откройте вкладку дата и перетащите на форму компонент OleDbDataAdapter. Если в настройках проекта такого компонента не окажется, то щелкните на вкладке Data палитры Toolbox правой кнопкой мыши и подключите искомый компонент командой Choose Items

  • В появившемся окне мастера настройки поставщика щелкните по кнопке New Connection и выберите файл подключаемой БД Northwind.mdb из прилагаемого к работе каталога Source


После щелчка на кнопке Next оболочка выдаст сообщение с предложением скопировать присоединенный файл БД в каталог проекта


  • Щелкните на кнопке " Да " и перейдите к следующей вкладке мастера


Здесь в текстовом поле предлагается указать SQL -запрос, который поставщик данных должен выполнять по умолчанию при заполнении набора данных DataSet. Мы хотим прочитать содержимое двух столбцов CustomerID и CompanyName из таблицы Customers, поэтому либо руками, либо с помощью мастера нужно в многострочном текстовом поле интерфейса мастера заполнить команду:

  • Щелкните на кнопке Query Builder, в диалоговом окне Add Table выберите из списка таблицу Customers и по щелчку на кнопке Add вкладки Tables (потом на Close ) отметьте в интерфейсе флажки против нужных полей таблицы, чтобы мастер написал для них текст запроса

  • Щелкните на кнопке OK окна Query Builder и текст запроса будет помещен в поле мастера


По умолчанию мастер готов создать операторы SQL не только для выборки, но и для вставки, обновления и удаления данных.

  • Нам на данном этапе потребуется только чтение данных и другие возможности нужно отключить щелчком на кнопке Advanced Options, сбросив ненужные флажки

  • Дойдите до последней вкладки мастера настройки поставщика и убедитесь, что включен только режим Select (но не Update, Insert, Delete)


  • Щелкните на кнопке Finish, чтобы завершить создание и настройку объектов поставщика данных (экземпляров OleDbDataAdapter и OleDbConnection ) и сохранить параметры в установках проекта
  • В панели Solution Explorer откройте файл Form1.Designer.cs и убедитесь, что мастер создал необходимый код с настройками поставщика, в состав которого входят экземпляры классов OleDbCommand, OleDbDataAdapter и OleDbConnection

Описанную процедуру можно в любом месте прервать щелчком на кнопке Cancel мастера настроек и вернуться к ней в любое время. Для этого достаточно щелкнуть в нижней части рабочей области на экземпляре класса OleDbDataAdapter правой кнопкой мыши и выполнитиь команду Configure Data Adapter (или выделить объект поставщика и выполнить ту же команду через пункт Data главного меню оболочки)


  • Выделите в проекте файл БД и через панель Properties установите его свойство Copy to Output Directory в значение Copy if newer, чтобы он находился вместе с исполняемой сборкой в одном каталоге bin проекта

Итак, у нас есть объект соединения с БД и объект-посредник между базой и набором данных (кэшем оперативной памяти), который должен выполнять команды SQL и управлять потоками данных. Теперь нужно создать сам набор данных как экземпляр класса DataSet.

  • Щелкните правой кнопкой мыши на экземпляре oleDbDataAdapter1 в нижней части рабочей области и выполните команду Generate DataSet (то же самое можно выполнить через меню Data оболочки)


  • В появившемся окне мастера Generate DataSet щелкните на кнопке OK


Будет создан объект набора данных dataSet11, который будет загружать два столбца таблицы Customers согласно SQL-запроса, указанного в настройках поставщика oleDbDataAdapter1.

В качестве элемента, отображающего набор данных объекта dataSet11, применим список ListBox.

  • Поместите на форму из вкладки Common Controls палитры компонентов экземпляр компонента ListBox и настройте его в соответствии с таблицей
Свойство Значение
( Name ) listBox
DataSource dataSet11
DisplayMember Customers.CompanyName
Dock Fill

Хотя набор данных dataSet11 правильно связан со свойствами элемента управления ListBox, но если выполнить приложение, то список останется пустым, потому, что набор данных не был заполнен данными. Код заполнения поместим в обработчик события Load формы.

  • В панели Properties выделите форму из раскрывающегося списка (или щелкните на заголовке формы) и в режиме Events создайте обработчик события Load, который заполните так
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
namespace FormsADO
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            // Заполняем набор данных настроенным адаптером данных 
            oleDbDataAdapter1.Fill(dataSet11);
    
            // Устанавливаем курсор списка в конец
            listBox.SelectedIndex = listBox.Items.Count - 1;
        }
    }
}
  • Запустите приложение и вы увидите данные поля Customers.CompanyName, связанного со свойством DisplayMember списка ListBox, подключенного к набору данных dataSet11 через свойство DataSource


Алексей Бабушкин
Алексей Бабушкин

При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Microsoft.Xna.Framework.Graphics;

   

namespace Application1

{

    public partial class MainForm : Form

    {

        // Объявим поле графического устройства для видимости в методах

        GraphicsDevice device;

   

        public MainForm()

        {

            InitializeComponent();

   

            // Подпишемся на событие Load формы

            this.Load += new EventHandler(MainForm_Load);

   

            // Попишемся на событие FormClosed формы

            this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed);

        }

   

        void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {

            //  Удаляем (освобождаем) устройство

            device.Dispose();

            // На всякий случай присваиваем ссылке на устройство значение null

            device = null;       

        }

   

        void MainForm_Load(object sender, EventArgs e)

        {

            // Создаем объект представления для настройки графического устройства

            PresentationParameters presentParams = new PresentationParameters();

            // Настраиваем объект представления через его свойства

            presentParams.IsFullScreen = false; // Включаем оконный режим

            presentParams.BackBufferCount = 1;  // Включаем задний буфер

                                                // для двойной буферизации

            // Переключение переднего и заднего буферов

            // должно осуществляться с максимальной эффективностью

            presentParams.SwapEffect = SwapEffect.Discard;

            // Устанавливаем размеры заднего буфера по клиентской области окна формы

            presentParams.BackBufferWidth = this.ClientSize.Width;

            presentParams.BackBufferHeight = this.ClientSize.Height;

   

            // Создадим графическое устройство с заданными настройками

            device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware,

                this.Handle, presentParams);

        }

   

        protected override void OnPaint(PaintEventArgs e)

        {

            device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);

   

            base.OnPaint(e);

        }

    }

}

Выбрасывается исключение:

Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл.

Делаю все пунктуально. В чем может быть проблема?

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000