Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗАДАНИЕ НА 6 ФЕВРАЛЯ 2015 Г.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
654.36 Кб
Скачать

Упражнение 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 в целом.