Опубликован: 05.08.2010 | Доступ: свободный | Студентов: 2009 / 47 | Оценка: 4.50 / 4.40 | Длительность: 60:26:00
Самостоятельная работа 5:

Просмотр данных OLE DB средствами ADO.NET

Упражнение 3. Выборка данных с помощью объекта DataTable

Объект System.Data.DataTable применяется для работы с одной таблицей из БД. Класс DataTable содержит три важных коллекции:

  • Columns - содержит ноль и более объектов DataColumn, которые определяют имя, тип хранимых данных и первичный ключ каждого столбца из DataTable
  • Rows - содержит ноль и более объектов DataRow, которые содержат реальные записи таблицы загруженных данных
  • Constraints - содержит объекты типа ForeignKeyConstraint или UniqueConstraint. Первые определяют действия, выполняемые над ключевым столбцом при изменении или удалении строки, вторые используются для обеспечения уникальности всех значений в данном столбце

Объекты DataTable могут быть частью набора DataSet, но могут существовать и отдельно. Объект DataTable может заполняться адаптером данных точно также, как и объект DataSet - с помощью метода Fill() адаптера. Для адаптера данных не нужно специально открывать соединение с БД, оно устанавливается автоматически при работе метода Fill() и сразу закрывается после завершения работы метода. DataTable предназначен для работы в качестве автономного кэша табличных данных. Загруженные в DataTable данные можно динамически связывать с элементами отображения.

В данном упражнении мы соединимся с таблицей Customers БД и загрузим из нее в отображаемый список имена заказчиков CompanyName по начальному словосочетанию ключа CustomerID. При этом для отключенного хранения данных в приложении будем использовать объект DataTable.

  • Добавьте к решению новый проект оконного приложения с именем WinForms3 и назначьте его стартовым

  • Создайте в корне проекта папку Data и скопируйте в нее из предыдущего проекта файл Northwind.mdb (при этом отклоните предложение мастера конфигурации источника данных)
  • Поместите на форму компоненты в соответствии с таблицей
Компонент Свойство Значение
Form Text Упражнение 3
  MaximizeBox False
Label Text Часть ID заказчика:
TextBox (Name) txtCustomerID
  Text пусто
ListBox (Name) lstCustomers
  Dock Bottom
  • Модифицируйте файл Form1.cs проекта WinForms3 следующим образом
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
// Дополнительные пространства имен
using System.Data.OleDb;
using System.Data.Common;
using System.Collections;
    
namespace WinForms3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            LoadCustomers();
        }
    
        // Строка соединения с абсолютным путем к БД, определяемым сборкой
        String ConnectionString(String fileName)
        {
            string JetEngineString = @"Provider=Microsoft.Jet.OLEDB.4.0;"
                + "Jet OLEDB:Engine Type=5;Data Source=";
            string pathToFile = Application.StartupPath.ToString() + "\\Data\\";
            return JetEngineString + pathToFile + fileName.Trim() + ".mdb";
        }
    
        OleDbDataAdapter adapter;   // Создадим в методе LoadCustomers() 
        DataTable table = new DataTable();
    
        void LoadCustomers()
        {
            String strCommand = "SELECT CustomerID, CompanyName FROM Customers "
                + "WHERE CustomerID LIKE '" + txtCustomerID.Text.Trim() + "%'";
            try
            {
                adapter = new OleDbDataAdapter(strCommand, ConnectionString("Northwind"));
                table.Clear();// Надо очистить, а то будет накопление !!!
                adapter.Fill(table);
    
                lstCustomers.Items.Clear();// Очищаем список
                foreach (DataRow row in table.Rows)
                {
                    lstCustomers.Items.Add(
                        row["CustomerID"] + "\t - " + row["CompanyName"]);
                }
    
                /*
                // Связываем прочитанные данные с элементом отображения
                //lstCustomers.Items.Clear(); // Нельзя очищать связанный список!!!!!
                lstCustomers.DataSource = table;
                lstCustomers.DisplayMember = "CompanyName";
                lstCustomers.ValueMember = "CustomerID";
                */
            }
            catch (OleDbException exc)
            {
                MessageBox.Show(exc.Message, "Ошибка", 
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}

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


Предикат LIKE команды задает шаблон ' xx% ' проверки соответствия начальной фразы с любым последующим количеством символов поля CustomerID. Шаблон ' %xx% ' выбирает записи с установленной фразой в любом месте поля поиска. Если в шаблон с LIKE передается пустая строка, то будут выбраны все записи указанной таблицы.

  • Создайте обработчик события KeyDown для текстового поля txtCustomerID с тем, чтобы список обновлялся по нажатию пользователем клавиши Enter при завершении ввода очередного значения параметра, и заполните его следующим кодом
private void txtCustomerID_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                LoadCustomers();
        }
  • Запустите приложение и поэкспериментируйте с его функциональностью, заложенной нами. Одно из представлений будет таким


Из кода видно, что объект DataTable является очень удобным средством работы с данными в отсоединенном режиме, как и вся инфраструктура ADO.NET в целом.

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

При выполнении в лабораторной работе упражнения №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" или один из зависимых от них компонентов. Не удается найти указанный файл.

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