- •Упражнение 1. Просмотр таблицы с помощью объектов DbCommand и DbDataReader
- •Упражнение 2. Выборочный просмотр таблицы с помощью объектов DbCommand и DbDataReader
- •Упражнение 3. Выборка данных с помощью объекта DataTable
- •Упражнение 4. Поиск строки DataTable с помощью метода Find()
- •Упражнение 5. Выборка строк DataTable с помощью метода Select()
- •Упражнение 6. Вычисляемые столбцы объектов DataTable
- •Упражнение 7. Работа с объектом DataView
Упражнение 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 в целом.
