SQL-Server (Основы запросов)
Меню раздела 1.
В этом разделе мы познакомимся с понятием реляционных баз данных. Узнаем зачем они существуют и каким образом проводится работа с ними. Будем создавать простые и более сложные SQL-запросы к таблицам БД и, главное, научимся разрабатывать правильную архитектуру БД и выстраивать связи между таблицами.
В раздел вошел 21 урок.
Урок 1 - Понятие реляционных баз данных
Продолжительность: 8 минут
Этот урок является вводным и направлен на правильное формирование у Вас
понятий реляционных баз данных
Что такое табличное представление связанных данных;
Зачем некоторый набор данных следует помещать в таблицу;
Почему всегда следует разносить данные по нескольким таблицам, а не хранить все в одной;
Какие связи могут существовать между двумя таблицами некоторой базы данных;
Что же представляют из себя правила нормализации БД и зачем следовать им.
Урок 2 - Создание БД, таблиц, столбцов
Продолжительность: 12 минут
В этом уроке мы начнем работу непосредственно в SQL-Server Management Studio Express
Создание первой базы данных;
Определение с количеством и качеством информации, хранящейся в данной БД;
Создание соответствующих таблиц. Выбор типа и размерности столбцов (колонок) каждой таблицы БД;
Рассмотрение ситуаций для определения того, или иного типа данных для каждого столбца;
Что такое первичный ключ и как его задать. Уникальность данных в столбце;
Классический тип столбца, предстьавляющий первичный ключ.
Урок 3 - Команда выборки SELECT
Продолжительность: 12,5 минут
В данном уроке Вы познакомитесь с синтаксисом команды выборки SELECT
Заполнение реальными данными созданной ранее таблицы;
Осмысление первой неудачи в занесении данных в одну из строк таблицы;
Синтаксис команды выборки SELECT;
Как правильно указывать имена столбцов, таблиц, БД;
Конструкция условия WHERE;
Выборка части данных и выборка по условию.
Урок 4 - Команда вставки INSERT
Продолжительность: 5,5 минуты
В данном уроке Вы поработаем с командой вставки новых записей в таблицы БД
Анализ ошибок предыдущего урока, связанных с неправильным заданием имени столбца - служебные символы;
Синтаксис команды INSERT.
Урок 5 - Команда редактирования UPDATE
Продолжительность: 8 минут
В этом уроке мы работаем с различными вариациями команды UPDATE
Синтаксис команды UPDATE;
Варианты изменения различных типов данных;
Внесение изменений в данные строковых и числовых типов;
Использование в запросе инструкции WHERE;
Отличие оператора "=" и инструкции "LIKE" в sql-запросе.
Урок 6 - Команда удаления DELETE
Продолжительность: 2 минуты
В этом уроке мы с Вами разберем команду удаления строк DELETE
Синтаксис команды DELETE;
Почему использование команды DELETE допустимо только с конструкцией WHERE.
Урок 7 - Like, Order By, Desc, Or, And
Продолжительность: 10 минут
Здесь мы поработаем с несколькими важными условными конструкциями запросов
Пример запроса с оператором Like;
Пример запроса с оператором Order By;
Пример запроса с оператором Desc;
Пример запроса с оператором Or и And;
Пример запроса с оператором Not.
Урок 8 - Not, In, Between, Distinct, Max, Min, Count, Sum, Avg
Продолжительность: 10,5 минут
В этом уроке мы продолжим тему предыдущего и поработаем с аггрегирующими функциями
Пример запроса с оператором Not;
Пример запроса с оператором In;
Пример запроса с оператором Between;
Пример запроса с оператором Distinct;
Пример запроса с оператором Max, Min, Count;
Пример запроса с оператором Sum;
Пример запроса с оператором Avg.
Урок 9 - БД из нескольких таблиц. Связи между таблицами
Продолжительность: 13,5 минуты
В этом уроке мы разбираемся с вопросом необходимости создания нескольких таблиц
Попытка запихнуть все данные в одну таблицу - масштаб проблем и неудобств;
Создание новых соответствующих таблиц;
Создание первичных ключей для каждой таблицы и установление внешних ключей через задание внешних связей.
Урок 10 -
Запрос к нескольким таблицам (а)
Продолжительность: 7 минут
В этом уроке мы рассмотрим расширенный запрос на выборку порции данных из нескольких таблиц
Синтаксис конструкции SELECT для выборки из нескольких таблиц с условием WHERE;
Другой вариант того же запроса - инструкция Join On.
Урок 11 -
Запрос к нескольким таблицам (б)
Продолжительность: 7 минут
В этом уроке углубляемся в составные запросы по нескольким таблицам
Фильтрация выходных данных по второй, не первой таблице;
Варианты конструкции запросов с оператором Join;
Примеры вложенных запросов-аналогов инструкции Join;
Отличие в результатах работы инструкции Left Join от обычного Join.
Урок 12 - Запрос к нескольким таблицам (в)
Продолжительность: 7,5 минут
В этом уроке мы рассмотрим несколько примеров с применением инструкций Join
Как просто понять отличие инструкций Left Join от Right Join;
Некоторые виды запросов с проверкой на NULL, не NULL;
Конструкция UNION.
Урок 13 -
Псевдонимы. Is Null. Вложенный запрос
Продолжительность: 7 минут
В этом уроке рассматриваются более сложные составные запросы с применением различных дополнительных условных конструкций
Изменение в выходном потоке названия столбца;
Еще несколько примеров составных запросов.
Урок 14 -
Создание БД из Visual Studio
Продолжительность: 7 минут
В этом уроке мы опять создаем БД, но уже из интерфейса Visual Studio
Создание и подключение БД из дизайнера в Visual Studio;
Создание таблицы для БД в Visual Studio.
Урок 15 -
Создание хранимой процедуры
Продолжительность: 8,5 минут
В этом уроке мы начнем создавать хранимую процедуру для наполнения данными таблицу
Синтаксис создания хранимой процедуры;
Определяемся с входными и выходными параметрами.
Урок 16 -
Процедура на вставку новой записи
Продолжительность: 10 минут
В этом уроке мы создаем запрос INSERT для хранимой процедуры
Использование функции CURRENT_TIMESTAMP дл автоматической вставки текущей даты и времени;
Запуск хранимой процедуры из Visual Studio;
Наполнение данными таблицы с помощью хранимой процедуры;
Какие преимущества в работе имеет хранимая процедура над обычным текстовым запросом.
Урок 17 -
Создание пейджинга
Продолжительность: 17 минут
В этом уроке мы начнем создавать хранимую процедуру для реализации пейджинга - постраничного вывода порционных данных на страницах веб-сайта
Определяемся со стандартными входными параметрами для пейджинга;
Параметр размерности страницы и параметр номера текущей страницы - пример поисковой страницы google.com;
Конструкции Over, Order By, Desc в запросе пейджинга;
Задание вычислимых полей и указание для них псевдонима;
Понятие временных (виртуальных) таблиц во внешнем запросе.
Урок 18 -
Тестирование пейджинга
Продолжительность: 7,5 минут
В этом уроке мы тестируем код пейджинга и доводим его до рабочего состояния
Долгий и нудный процесс тестирования хранимой процедуры.
Урок 19 -
Работа с таблицами, отношениями в дизайнере
Продолжительность: 9,5 минут
В этом уроке мы работаем с таблицами и связями между ними из дизайнера
Создание DataBase Diagrams;
Создание таблиц и внешних связей между ними в визуальном дизайнере Visual Studio;
Несколько слов о представлениях - View.
Урок 20 -
Создание БД и таблиц для Школы
Продолжительность: 17 минут
В этом уроке мы разработаем архитектуру БД для школьного заведения
Создание таблицы Peoples;
Создание таблицы Teachers;
Создание таблицы Subjects.
Урок 21 -
Создание связей между таблицами Школы
Продолжительность: 17 минут
В данном уроке мы завершаем создание таблиц и устанавливаем между ними внешние связи
Выносим оценки в отдельную таблицу;
Одна оценка - один ученик, - отношение "Один-К-Одному";
Отношение "Один-Ко-Многим";
Отношение "Многие-Ко-Многим";
Как реализовать отношение "Многие-Ко-Многим" в данной БД?
Какие столбцы должны присутствовать в промежуточной таблице реализации отношения "Многие-Ко-Многим";
Проверяем структуру таблиц БД в визуальном дизайнере.
Перейти к форме заказа
ADO.NET (connected model)
Меню раздела 2.
В этом разделе мы разработаем windows-приложение - систему учета кредитами (банковский проект). Во время разработки архитектуры БД и самого проекта мы научимся работать с технологией ADO.NET в режиме соединенной модели.
Также мы поработаем с режимом транзакций, в котором несколько команд выполняются как одно целое.
В раздел вошли 38 уроков.
Урок 1 -
Разбор технического задания
Продолжительность: 11,5 минут
В этом уроке мы подробно разберем техническое задание проекта "Банковская система учета кредитованием"
Определение функциональности системы;
Выяснение ограничений и условий при работе приложения;
Осмысление целостности проведения операций - режим транзакций;
Быстродействие работы приложения, его устойчивость и масштабируемость;
Пользовательский графический интерфейс;
Обобщение базовых функций системы учеты кредитования, поиск банковской информации;
Определение с количеством таблиц БД и соответствующими обьектами на клиенте.
Урок 2 - Создание БД для банка
Продолжительность: 12,5 минуты
В этом уроке мы создаем архитектуру БД и реализовываем её в таблицах данной БД
Создание базы данных "BANK" для проекта;
Создание таблицы для дебиторов "Debitors";
Создание таблицы для кредитов дебитора - "Credits";
Создание таблицы платежей по кредиту - "Payments";
Создание связей между таблицами;
Осмысление необходимости проведения транзакции по занесению данных в таблицу "Payments".
Урок 3 -Создание заготовки главного окна
Продолжительность: 30 минут
Здесь мы начинаем разработку пользовательского интерфейса главного окна приложения
Знакомство с пользовательским интерфейсом главного окна приложения;
Взаимосвязь имеющихся контролов DataGridView между собой на главной форме;
Взаимосвязь DataGridView для дебиторов и текстовых полей формы;
Создание главного меню формы;
Создание панели поиска информации по БД.
Урок 4 -3-х звенная архитектура
Продолжительность: 16 минут
В этом уроке мы познакомимся с понятием 3-х звенной архитектурой
Что такое n-звенные системы - n-tier system;
Уровни UI, BLL, DAL - зачем нужны и что дают;
Причины необходимости соблюдать четкую архитектуру n-звенного приложения;
Синтаксис создания массивов. 3 способа добавления элементов в массив;
Задачи и функциональность уровня UI;
О чем знает и о чем не должен знать уровень UI;
Задачи и функциональность уровня BLL;
О чем знает и о чем не должен знать уровень BLL.
Задачи и функциональность уровня DAL;
О чем знает и о чем не должен знать уровень DAL.
Создание заготовки класса уровня DAL;
Описываем параметры строки соединения ConnectionString.
Урок 5 -Код выборки данных из БД
Продолжительность: 13,5 минут
В этом уроке мы создадим метод выборки всех существующих в БД дебиторов
Подключение требуемых пространств имен System.Data.SqlClien;
Настройка объекта-команды SqlDataCommand и выбор коллекции ArrayList;
Настройка объекта-соединения SqlConnection.
Когда следует открывать соединение с БД и когда следует закрывать;
Использование объекта SqlDataReader.
Знакомство с командой ExecuteReader;
Объект DbDataRecord;
Проверка существования выбранных данных HasRows
DataGridView.DataSource - привязываем полученные данные к одному из табличных контролов.
Урок 6 -Настройка свойств колонок DataGridView
Продолжительность: 14 минут
В данном уроке мы занимаемся визуальной настройкой отображения данных в элементе управления DataGridView
Заполнение данными таблицы Debitors;
Прячем некоторые столбцы выходных данных в визуальном елементе DataGridView;
Вставляем код вылова исключений для несуществующих столбцов;
Как выполнять проход по элементам двумерного массива;
Назначаем название крайней левой колонке грида и растягиваем колонки с данными на всю ширину таблицы.
Урок 7 -Оператор Using для объекта соединения
Продолжительность: 6 минут
Здесь мы углубляемся в принципы управления соединением с источником данных
Почему вместо метода Close для закрытия соединения с источником данных предпочтительнее использовать метод Dispose;
Забываем закрывать соединение вручную - объект Reader сам закрывает соединение (параметр CommandBehavior.CloseConnection);
Ключевое слово Using - прекрассная альтернатива параметру CommandBehavior.CloseConnection;
Синтаксис применения блока Using. Обязательное условие использования;
Сортировка выходных данных.
Урок 8 -Связь TextBox с DataGridView
Продолжительность: 11,5 минут
В этом уроке мы завяжем текстовые поля деталей дебитора на активную строку соответствующего DataGridView
Подписываем грид на событие CellEnter;
Вытягиваем данные из делегированных параметров события для установления значения в текстовые поля;
Применяем тернарный оператор для одновременного гибкого представления отсутствующих данных;
Урок 9 -Связь родительского и дочернего DataGridView
Продолжительность: 14,5 минут
В этом уроке мы организуем взаимосвязь табличных контролов для динамического отображения кредитов для выбранного дебитора
Устанавливаем DataSource для DataGridView кредитов;
Вытягиваем свойство CurrentRow для доступа к соответствующей ячейке (Cell) активной строки;
Создаем метод уровня DAL для получения весх кредитов для некоторого дебитора;
Создание текста Sql-запроса для объекта Sql-Command;
Получение данных и динамический вывод их на второй DataGridView.
Урок 10 -Оптимизация запросов к БД
Продолжительность: 11 минут
В данном уроке мы кардинально повышаем скорость загрузки приложения в оперативную память компьютера
Сортировка выходных данных по дате занесения данных в таблицу БД;
Лишние срабатывания события CellEnter для DataGridView дебиторов - почему;
Оптимизируем количество обращений к БД посредством позднего подписывания на соответствующие события;
Необходимость в подписывании на событие FormLoad.
Урок 11 -Продолжение повышения оптимизации
Продолжительность: 11,5 минут
В этом уроке мы выполняем аналогичные действия предыдущих 6 уроков для DataGridView кредитов дебитора
Урок 12 -Работа над закрытием приложения
Продолжительность: 6 минут
В данном уроке мы реализуем контролируемый процесс закрытия приложения
События FormClosing для перехвата момента подготовки к закрытию главного окна;
Вмешиваемся в процесс закрытия главного окна. Вариант с Application.Exit;
e.Cancel и this.Close.
Урок 13 -Создание нового дебитора - DAL
Продолжительность: 15,5 минут
Этот урок посвящен реализации функциональности создания нового дебитора
Создаем новую форму для создания нового дебитора;;
Набрасываем на форму контролы, необходимые для принятия данных персоны;
Реализовываем метод занесения нового дебитора в БД на уровне DAL.
Урок 14 -Создание нового дебитора - UI
Продолжительность: 16 минут
В этом уроке мы продолжаем работать над функциональностью создания дебитора с позиции пользовательского интерфейса
Подписываемся на событие выбора пункта главного меню для открытия формы создания нового дебитора;
Определяем полномочия главной формы и формы создания дебитора;
Понимаем необходимость сохранения состояния дочерней формы;
Какая из форм имеет возможность общатьсяс уровнем BLL;
Определяем моент завершения создания дебитора путем манипулирования свойством DialogResult;
Обнаруживаем ошибки в работе приложения;
Автоматическая генерация идентификатора дебитора через тип Guid - Guid.NewGuid.
Урок 15 -Тестирование кода - BLL
Продолжительность: 7 минут
В этом уроке мы оттачиваем процесс создания и сохранеия данных нового дебитора в БД с одновременным отображением изменений на клиенте
Меняем тип столбца идентификационного кода дебитора;
Добиваемся успеха в сохранении в БД данных нового дебитора;
Проблема отставания отображения нового дебитора контролом DataGridView;
Повторный запрос на получение данных к БД;
Обсуждение целесообразности генерирования идентификатора нового дебитора на каждом из уровней архитектуры приложения.
Урок 16 -Создание нового кредита - UI
Продолжительность: 12 минут
Здесь мы начнем создание функциональности по выдаче кредита дебитору
Определение ключевых моментов процесса создания (выдачи) нового кредита;
Создание формы для выдачи кредита;
Почему для дебиторов мы используем не TextBox, а ListBox и как мы думаем их заполнять?
Урок 17 - Создание нового кредита - DAL
Продолжительность: 11,5 минут
Здесь мы создадим метод уровня DAL для внесения данных в БД по кредитам
Создание метода для сохранения данных нового кредита в БД;
Особенности работы 3-х звенной архитектуры приложения - повторное осмысление преимуществ;
Определяемся с типами входных параметров для метода сохранения данных в БД;
Почему в данном случае тип входных параметров не особо важен?
Урок 18 -Создание нового кредита - BLL
Продолжительность: 12 минут
В этом уроке мы настраиваем форму выдачи кредита на правильное представление данных
Завязываем оба ListBox на общий DataSource;
Устанавливаем свойство DisplayMember и ValueMamber обеих ListBox;
Реализация автозаполнения связанных TextBox;
Работа с событием TextChanged для перехвата ввода текста в текстовое поле;
Предотвращение ввода недопустимого пробела.
Урок 19 -
Тестирование кода, DAL
Продолжительность: 16 минут
В этом уроке мы добиваемся более правильной и устойчивой работы приложения при выдаче нового кредита
Реализация функциональности по нажатиию кнопки сохранения нового кредита;
Определяем типы параметров, передаваемых в метод сохранения данных уровня DAL;
Вытягиваем данные из контрола DateTimePicker;
Предотвращение возможности выдачи кредита не существующему дебитору;
Автоматическое манипулирование доступностью контролов управления на форме выдачи кредита в случае не заполненых ListBox;
Проверка работоспособности кода через эмуляцию ситуации не заполнения данными по дебиторам соответствующих выпадающих списков.
Урок 20 -Работа с элементами управления UI
Продолжительность: 15 минут
В этом уроке мы продолжаем совершенствовать устойчивость работы формы по выдаче нового кредита
Заканчиваем с проверкой ввода значения суммы кредита;
Добиваемся допустимости ввода только цифр и одной точки (запятой) - событие KeyPress;
Использование свойства параметра e.KeyChar для определения кода вводимого символа;
Работа с событием Leave;
Вставляем элемент Label для демонстрации ошибочных данных.
Урок 21 -Создание нового платежа, UI
Продолжительность: 19 минут
Здесь мы начнем реализовывать функциональность по приему платежа по кредиту
Создание формы принятия оплаты по кредиту;
Набрасываем контролы вводимых данных по платежу;
Добавляем контролы ListBox для существующих дебиторов и для существующих кредитов текущего дебитора;
Создаем код для запуска формы по принятию платежа;
Заполняем ListBox дебиторов данными;
Динамически заполняем ListBox кредитов дебитора данными;
Выясняем как лучше указать свойства привязки данных ValueMember и DisplayMember - декларативно через панель свойств, или динамически в коде.
Урок 22 -Настройка визуальных контролов
Продолжительность: 12 минут
В этом уроке мы продолжаем настраивать работу визуальных контролов формы для принятия платежа
Закрываем доступность кнопки сохранения результатов при не заполнении любого их ListBox
Событие KeyPress - запрет ввода всего, кроме цифр и десятичной точки (запятой).
Урок 23 -Реализация дополнительных проверок
Продолжительность: 11,5 минут
В этом уроке мы займемся реализацией проверок границ на ввод суммы платежа
Установление и проверка верхней и нижней границы вносимой суммы платежа.
Работа с событием Leave;
Урок 24 -Создание нового платежа, BLL
Продолжительность: 8,5 минут
В этом уроке мы полностью завершим работу над функциональностью кнопки принятия платежа
Ответственный момент конвертации типа string суммы платежа в тип decimal;
Подготовливаем данные перед передачей их в метод уровня DAL.
Урок 25а -Создание нового платежа, DAL (а)
Продолжительность: 14,5 минут
В этом уроке мы работаем с созданием запросов к БД в режиме транзакций
Возможности транзакций;
Переименовываем параметры и создаем дополнительные переменные успешности проведени транзакции;
Синтаксис определения транзакции, объект SqlTransact;
Когда следует открывать соединение при проведении транзакции;
Метод BeginTransaction;
Зачем и когда следует вызывать метод Commit?
Откат всех изменений, проведенных с БД в режиме транзакции, метод RollBack.
Урок 25б -Создание нового платежа, DAL (б)
Продолжительность: 14 минут
В этом уроке мы добиваемся правильной конвертации типа decimal в тип string для внесения данных в БД
Исправляем ошибку в имени параметра запроса транзакции;
Отлавливаем синтаксические ошибки в строке запроса к БД;
Почему тип decimal конвертируется в тип string не правильно? Что не так для отправки данного типа данных в БД?
Тип IFormatProvider и CultureInfo для решения проблем представления конвнртации в тип string с поддержкой в БД;
Плохая альтернатива выполнения нескольких запросов в режиме транзакции через один запрос с несколькими командами.
Урок 26 -Локальное сохранение БД, UI
Продолжительность: 7,5 минут
В этом уроке мы создадим на уровне BLL метод для выполнения сохранения данных БД в локальных файлах;
Создание метода для вызова уровня DAL локального сохранения данных;
Тестирование MessageBox после упешного/неудачного сохранения данных.
Урок 27 -Локальное сохранение БД, DAL (а)
Продолжительность: 25,5 минут
В этом уроке мы добъемся структурной записи данных из таблицы Debitors в файл формата csv для последующего открытия в программе Microsoft Excel
Пространство имен System.IO - базовое для работы с файлами и файловыми потоками чтения/записи;
Создание объекта StreamWriter для получения возможности создания и записи данных в файл;
Объект FileStream с параметром FileMode.Create, имя файла типа csv;
Обязательный выбор кодировки через тип Encoding.ASCII - зачем и почему без него не обойтись?
Метод GetEncoding и кириллица 1251;
Создаем запрос к БД и через объект Reader наполняем файл .csv данными из объекта Reader;
Удобные методы GetValue, GetString и индексатор Reader[].
Построчная запись в файл методом WriteLine;
Тип csv и управляющие символы " ; " " @ " и " '' ".
Урок 28 -Локальное сохранение БД, DAL (б)
Продолжительность: 12,5 минут
В этом уроке мы заканчиваем с локальным сохранением копии БД в файлах.
Выполняем аналогичные действия из предыдущего урока для сохранения таблиц Credits и Pauments;
Конструкция Using и метод Dispose для объектов файловых дескрипторов, потоков;
Несколько слов о более правильной работе с запросами к БД.
Урок 29 -Создание параметризированных запросов
Продолжительность: 18 минут
В этом чрезвычайно важном уроке мы узнаем о важности ведения работы с БД через объекты-параметры
Выяснение проблем и неудобств при работе со строковыми командами, передаваемыми в БД для выполнения запроса;
Взлом БД посредством внедренного запроса;
Синтаксис создания параметризированного запроса;
Объект SqlParameter - создание через конструктор, настройка параметров;
Тип SqlDbType - сброс с плеч программиста геморроя по контролированию типов данных;
Добавление параметров в команду запроса;
Перегрузка конструктора SqlParameter для одновременного задания множества свойств объекта параметра;
Почему в ASP.NET работа с БД ведется только через объекты-параметры?
Урок 30 -Применение хранимых процедур
Продолжительность: 14 минут
В этом уроке мы поработаем с хранимой процедурой для получения всех кредитов дебитора
Еще раз о преимуществах хранимой процедуры над обычным текстовым запросом;
Создаем хранимую процедуру для получения всех кредитов данного дебитора;
Настройка объекта SqlCommand на хранимую процедуру;
Указывание объекта - свойства CommandType.StoredProcedure
Создание параметра и добавление его в объект SqlCommand хранимой процедуры;
Обязательное использование перечисления ParameterDirection из пространства имен System.Data
Исправление синтаксической ошибки в тексте хранимой процедуры.
Урок 31 -Реализация в DataGridView вывода номеров строк
Продолжительность: 10 минут
В этом уроке мы добавим нумерацию строк в контролах DataGridView
Осмысляем необходимость выполнения нумерации строк в DataGridView;
Подписываем все DataGridView на событие RowPrePaint;
Реализовываем вывод номера каждой строки в заголовочном столбце HeaderCell
убираем эффект мерцания номеров строк воспользовавшись методом ToString() для правильного сравнения значений объектов.
Урок 32 -Реализация поиска, BLL
Продолжительность: 16,5 минут
В этом уроке мы начнем реализацию поиска дебиторов и их кредито с платежами в приложении
Определяемся с данными, по которым будем выполнять поиск;
Набрасываем в панельку поиска текстовые поля для формирования критерия поиска;
Выбираем посик по элементу DataGridView;
Создаем на уровне класса список List типа DataGridViewRow для поддержания способности последовательного перемещения по найденным строкам;
Использование в цикле индексатора DataGridViewRow.Cells[] для доступа к значению интересующей нас ячейке любой строки DataGridView;
Управление доступностью кнопки перемещения вперед по результатам поиска в зависимости от количества найденых записей.
Урок 33 -Расширение функции поиска, UI
Продолжительность: 19 минут
В этом уроке мы реализовываем способность последовательного перемещения в DataGridView по найденным строкам, перепрыгивая через остальные
Долго тестируем работу поиска;
Реализовываем логику перемещения по результатам поиска;
Зачем нам дополнительный список для хранения результатов поиска?
Урок 34 -Поиск на стороне сервера, хранимая процедура
Продолжительность: 12,5 минут
В этом уроке мы создадим хранимую процедуру для поиска дебиторов
Создаем хранимую процедуру поиска дебиторов;
Определение типов входных параметров;
Почему мы не будем использовать функцию Convert для преобразования типов данных на SQL-Server?
Синтаксис функции конвертации типов Cast;
Зачем, для применения оператора Like, нам понадобилось преобразовывать типы?
Преобразование значения некоторых данных в виде String.Empty в null;
Долгий и мучительный процесс нахождения оптимального варианта кода хранимой процедуры;
Избавление от условных операторов в теле хранимой процедуры.
Урок 35 -Поиск - изменения DAL, BLL
Продолжительность: 10 минут
В этом уроке мы реализовываем возможность выбора источника для проведения поиска
Создание метода в уровне DAL для поиска дебиторов;
Настройка объекта соединения, объекта комманды и объектов параметров для выполнения хранимой процедуры;
Добавляем в панель поиска дебиторов элемент управления CheckBox для выбора типа поиска (на клиенте/на сервере) и вносим соответствующие изменения на уровне BLL.
Урок 36 -Расширение функциональности поиска
Продолжительность: 6 минут
В этом уроке мы доводим функцию поиска до безупречной работы
Исправляем ошибку интерфейса поиска;
Исправляем принцип активации/диактивации кнопки последовательного перемещения;
Оптимизируем функцию поиска для правильного переключения по источнику поиска;
Выход один - чистить ArrayList методом Clear :)
Урок 37 -Чтение нескольких наборов строк в одном объекте Reader
Продолжительность: 15 минут
В этом уроке мы научимся выбирать несколько наборов данных в одном объекте Reader
Создание нового проекта и настройка соответствующих объектов для доступа к БД;
Пресловутый метод NextResult;
Акцентирование внимания на способе выполнения итераций для перебора нескольких наборов данных по объекту Reader;
Варианты сохранения перебираемых данных в коллекциях и массивах.
Перейти к форме заказа
ADO.NET (disconnected model)
Меню раздела 3.
В этом разделе мы реализовываем проект из предыдущего раздела, но теперь по отсоединенной модели - используя типы DataSet, DataTable, DataRow, DataColumn, DataAdapter, DataRelation, DataConstrain и т.д. Досконально разбираемся с процессом создания и редактирования данных как в самих объектах DataRow так и через контрол DataGridView. Материал этого раздела является чрезвычайно важным в формировании базы знаний процесса создания и работы с табличными данными на клиенте.
В раздел вошло 45 уроков
Урок 1 - Введение в формат xml
Продолжительность: 11,5 минут
В этом уроке мы познакомимся с понятием формата xml и поработаем с конфигурационным файлом настроек приложения.
Базовые понятия формата xml;
Файлы конфигурации приложения app.config и web.config;
Принципы формирования древовидной структуры данных файла типа xml;
Загоняем параметры строки соединения с БД в файл конфигураций приложения app.config;
Знакомство с типами ConfigurationSettings и ConfigurationManager.
Два базовых варианта получения полной строки соединения из файла настроек.
Урок 2 -Важные идеологические отличия двух моделей
Продолжительность: 9 минут
В этом уроке мы разбираемся с понятиями соединенного и отсоединенного режима работы с источником данных
Обобщаем опыт, полученный при работе с отсоединенной моделью;
Знакомство с понятием отсоединенной работы с источником данных;
Принцип действия и особенности в работе отсоединенной модели;
Жизненный пример использования отсоединенной модели в работе с данными;
Преимущества и недостатки соединенной и отсоединенной моделей;
Урок 3 -Работа с объектом DataColumn
Продолжительность: 13 минут
В этом уроке мы создадим множественные объекты класса DataColumn
Понимаем необходимость продолжения учебы "задом-на перед" - не так, как в книгах;
Объект DataColumn. Создание, настройка, конструктор;
Столбец таблицы БД - не столбец, представленный типом DataColumn;
Принципы настройки свойств объекта-колонки;
Свойства Caption, ReadOnly, AllowDbNull, Unique, AutoIncrement, AutoIncrementStep, AutoIncrementSeed;
Понимаем нюансы относительно правильной настройка каждого свойства объекта DataColum.
Урок 4 -Работа с объектами DataTable и DataRow
Продолжительность: 11 минут
Здесь мы создаем новую строку, наполняем её данными и помещаем в таблицу
Создание объекта DataTable;
Добавление созданных ранее колонок в объект DataTable. Свойство Columns и методы Add, AddRange;
Особенности создания строк - объект класса DataRow;
Используя индексатор, заполняем данными строки объекта DataTable;
Обязательный момент добавления новой сформированной строки в объект типа DataTable;
Урок 5 -Связывание DataGridView с DataTable
Продолжительность: 6,5 минут
В этом уроке мы поработаем с добавлением новых строк непосредственно через контрол DataGridView
Набрасываем на форму контролы DataGridView и Button;
Реализовываем привязку данных на вывод в DataGridView только по нажатию на кнопке;
Вставляем новые строки непосредственно в контроле DataGridView;
Почему при попытке ввода новой строки вылетает ошибка?
События покидания редактируемой ячейки и автоматические проверки валидности введенных данных;
Почему добавленные в DataGridView новые строки удаляются при закрытии приложения?
Урок 6а -Программное добавление DataRow в DataTable
Продолжительность: 12 минут
В данном уроке мы всячески поработаем с добавлением новых строк и познакомимся с вариантами их состояния
DataTable - обычная временная переменная?!
Добавляем строки и определяем количество строк в объекте DataTable;
Интересная взаимосвязь DataTable и DataGridView;
Особенности добавления новых строк не через DataGridView, а через DataTable;
Подитоживаем особенности связки DataGridView с DataTable;
Перемещаемые колонки визуального контрола;
Отображение статуса строк. Наблюдение за изменяющимся статусом отдельных строк;
Анализ перечисления DataRowState.
Урок 6б -Работа с состоянием строк DataRow
Продолжительность: 12 минут
В этом уроке изучаем инструменты манипулирования состоянием строк и их данными
Почему отредактированная строка получила значение свойства DataRow.RowState Added, а не Changed?!
Когда и при каких обстоятельствах строка получает состояние Detached;
Когда строки имеют статус UnChanged;
Особенности работы с методом AcceptChanges;
Так что же выполняет метод AcceptChanges;
Множественные вызовы во времени метода AcceptChanges;
Метод RejectChanges откатывает последние изменения в строке.
Урок 7 -Подробнее о методе AcceptChanges
Продолжительность: 16,5 минут
В этом уроке просто двигаемся дальше к пониманию общего понятия DataSet
Жизненный пример управления состоянием строк;
Когда может понадобиться вызвать метод AcceptChanges на уровне DataTable для всех строк;
Несколько слов об объекте DataSet;
Долго-долго создаем объекты DataColumn и DataTable для таблицы кредитов;
Как получилось так, что в DataGridView кредитов мы смогли занести данные, отсутствующие в DataGridView дебиторов?
Урок 8 -Знакомство с объектом DataSet
Продолжительность: 10,5 минут
В этом уроке мы вплотную приблизимся к моменту обширной настройки объекта DataSet
Еще раз о необходимости создания взаимосвязей между таблицами;
Где создаются внешние связи между объектами DataTable;
Создаем таблицу для платежей;
Создаем объект DataSet - локальная копия представления БД;
Необходимость ручной настройки DataSet и его внутренних элементов для "клонирования" структуры серверной БД;
Урок 9 - Объекты DataSet и DataRelation
Продолжительность: 18,5 минут
В этом уроке мы научимся правильно создавать отношения между таблицами и заносить их в DataSet
Создаем объект DataSet и добавляем в него существующие таблицы DataTable;
Коллекции DataSet: DataTableCollection, DataRelationCollection, PropertyCollection;
Информируем DataSet через индексатор ExtenderProperty;
Объект DataRelation для задания отношения "Родитель-Потомок" таблиц дебиторов и кредитов;
Объект DataRelation для задания отношения "Родитель-Потомок" таблиц дебиторов и кредитов;
Несколько вариантов создания связей между таблицами;
Добавление релейшинов в объект DataSet и проверка работы при добавлении связанных строк в DataGridView.
Урок 10 -Работа с пользовательским интерфейсом
Продолжительность: 16 минут
В этом уроке мы поработаем над повышением юзабельности пользовательского интерфейса, в частности контрола DataGridView
релизовываем поддержу автоматического слежения активной ячейки строки DataGridView за перемещением курсора мыши;
Используем свойства e.RowIndex и e.ColumnIndex для вычисления координат ячеек;
Используем элемент NumericUpDown для реализации программного удаления любой строки из DataTable;
Определяем количество находящихся в DataTable строк для предотвращения появлению исключительной ситуации при удалении не существующих строк.
Урок 11 -Удаление строки из DataGridView
Продолжительность: 21,5 минут
В этом уроке мы рассмотрим полезные примеры кода работы контекстного меню в связке c DataGridView
Пример добавления, редактирования, удаления строк непосредственно в DataGridView;
Убираем возможность удалять строки из DataGridView в режиме работы с пользовательским интерфейсом;
Создаем контекстное меню с пунктом меню для программного удаления строк из DataGridView;
Используя свойство CurrentRow находим текущую строку и выполняем её удаление, добившись вызова контекстного меню над требуемой ячейкой текущей строки;
Проблема удаления текущей строки при отключенной слежки активной ячейки за курсором. Как быть?
Вытягиваем свойство DataGridViewCellEventArgs для определения ячейки, над которой было вызвано контекстное меню с целью удаления именно той строки, которая и содержит эту ячейку;
Более гибкий способ определения координат ячейки, над которой было вызвано контекстное меню, основанный на использовании типа Point.
Урок 12 -Редактирование строк в DataTable
Продолжительность: 20 минут
В этом уроке мы попробуем программный способ для редактирования строк и затронем тему событий редактирования строк
Исправление маленькой неточности, допущенной в прошлом уроке;
Запрещаем возможность непосредственного редактирования строк в DataGridView;
Создание UI для редактирования строк DataFridView;
Создаем метод для внесения изменений в строки DataTable;
Что еще за автоматические проверки при внесении изменений в самом коде метода?
Методы DataRow BeginEdit, EndEdit, CancelEdit;
Принцип и условия возникновения выполнения методов, связанных с редактированием строки;
Когда вызывается метод EndEdit;
При каких обстоятельствах следует вызывать метод CancelEdit?
Урок 13а -BeginEdit, EndEdit, AcceptChanges
Продолжительность: 17 минут
В этом уроке мы разберем первую часть большого и очень важного, для понимания работы со строками DataRow, кода
Введение в код, базирующийся на примере из MSDN, для демонстрации режамов и состояний, присущих объектам DataRow;
Долгое-долгое рассмотрение примера работы исходного кода для полного выяснения процесса создания, редактирования, удаления строк. Состояния строк RowState, версий строк RowVersion, зависимость всего этого от вызовов методов AcceptChanges и RejectChanges, BeginEdit, EndEdit, свойства DataRowVersion Original и Proposed и много многое другое...;
Версии значений ячеек строки - стараые значения и новые предлагаемые;
Урок 13б -BeginEdit, EndEdit, AcceptChanges
Продолжительность: 17 минут
В данном уроке мы продолжаем исследовать обширный и наполненный множества событий процесс редактирования строк
Зачем в строке хранить старое значение данных. Метод CancelEdit;
Неужели метод BeginEdit отменяет любые проверки при редактировании строк?
Режимы редактируемой строки Modified и Unchanged неразрывно связаны друг с другом;
Подробнейший анализ всей этой кухни с режимами редактирования строк, их версиями, состояниями, отката и фиксации;
Голова идет кругом. Но что поделать, этот урок надо переварить.
Урок 14 -Поиск, фильтрация и сортировка в DataTable
Продолжительность: 17,5 минут
В этом уроке мы реализуем поиск, фильтрацию и сортировку по DataTable
Принцип использования метода Select для объекта DataTable;
Применяем в методе Select знакомый оператор Like;
Находим строки по интересующим ячейкам с выполнением условия;
Комбинированный поиск, добавление условия сортировки.
Урок 15 -Объект привязки к данным BindingSource
Продолжительность: 12 минут
В этом уроке мы работаем с визуальным контролом связывания данных BindingSource
Почему сложно занести найденные строки в новый объект DataTable;
Демонстрация факта приналежности каждой строки к определенной и единственной DataTable;
Создание объекта BindingSource для определенной таблицы;
Настройка фильтра и сортировки BindingSource чуруз свойства Sort и Filter;
Как правильно завязать DataGridView на BindingSource?
Урок 16 -Объект представления строк DataView
Продолжительность: 9 минут
Из этого урока мы узнаем о типе DataView и используем его для выборочного отображения определенных строк DataTable
Знакомство с типом DataView;
Создание объекта DataView на основе DataTable;
Изменяем DataSource для DataGridView на созданный объект DataView;
Настройка фильтра объекта DataView, свойство RowFilter;
Использование перечисления DataViewRowState для отбора строк определенного состояния;
Работа с конструктором типа DataView.
Урок 17 -Сохранение объекта DataSet в XML формате
Продолжительность: 11 минут
В данном уроке мы научимся сохранять состояние DataSet в файлах формата xml
Реализуем метод для сохранения объекта DataSet в файлах типа xml;
Принципиальные отличия в структурном представлении обычных файлов xml и конфигурационных файлов настроек app.config и web.config;
Несколько слов о названиях тегов формата xml;
Сохраняем данные в формате xml и анализируем полученные результаты;
Зачем сохранять схему DataSet? Методы ReadXml, WriteXml, ReadXmlSchema? WriteXmlSchema
Загрузка DataSet данными из файлов xml;
Настройка схемы DataSet из файла интерпретации xsd;
Немного слов о визуальном представлении xml-данных сохраненного DataSet;
Главное преимущество передачи данных в формате xml;
Урок 18 -Задание стиля сохранения данных в XML
Продолжительность: 7 минут
В этом уроке мы настроим стиль формирования и представления древовидной структуры данных формата xml
Несколько слов о тегах (узлах), их аттрибутах и внутренних данных;
Зачем уникальный идентификатор выносить в аттрибут?
Как добиться сохранения состояния DataSet в формате xml с представлением некоторых данных в качестве аттрибутов?
Перечисление MappingType;
Урок 19 -Работа с объектом DataTableReader
Продолжительность: 12 минут
В этом уроке мы поработаем с объектом DataTableReader
Понятие однонаправленного потока чтения по объекту DataTable;
Создание объекта DataTableReader используя метод CreateDataReader;
Циклическое чтение данных методом Read;
Получение названия столбцов и данных ячеек через методы GetName и GetValue;
Особенности вызова методов GetName и GetValue;
Урок 20 -Введение в объект DataAdapter
Продолжительность: 14 минут
В этом уроке мы начнем изучать тип DataAdapter, его концептуальную модель
Обзор возможностей класса DataAdapter
Разбираемся с принципом работы адаптеров
Как обычно используются адаптеры при манипулировании с данными, когда следует использовать адаптер, а когда следует обойтись без него?
Создаем заготовку для начала работы с DataAdapter.
Урок 21 -Загрузка данных с помощью адаптеров
Продолжительность: 10 минут
Здесь мы плотно поработаем с созданием и настройкой адаптеров
Создаем три адаптера типа SqlDataAdapter для всех трёх таблиц;
Настраиваем необходимые параметры для вызова конструктора адаптера;
Загружаем в таблицы DataSet данные с помощью адаптеров;
Урок 22 -Формирование правильного DataSet
Продолжительность: 12 минут
Здесь мы займемся правильной настройкой DataSet
Почему следует вручную настраивать DataSet?
Создания первой связи, объект DataRelation;
Настройка второй связи;
Реализовываем завязку табли, заполненных адаптерами, на отображение в DataGridView;
Урок 23 -DataView и связи между DataGridView
Продолжительность: 8,5 минут
В этом уроке мы используя тип DataView мы начинаем реализовывывать интерактивную связь между DataGridView
Обобщение сложившейся ситуации в выборе DataView в качестве источника данных для DataGridView;
Создаем объекты DataView для каждой таблицы DataSet;
Подитоживание имеющегося кода.
Урок 24 -Реализация связей между DataGridView
Продолжительность: 21 минут
В этом уроке мы реализуем интерактивную взамосвязь между DataGridView
Подписываемся на событие загрузки главной формы и там же подписываемся на события CellEnter каждого DataGridView;
Механизм "слежения" текстовых полей за выбором строки в DataGridView;
Используем свойство RowFilter объекта DataView для связи DataGridView кредитов с дебиторами;
Симулируем вызов события выбора ячейки в DataGridView для правильного отображения пустых данных;
Выполняем всю работу предыдущих пунктов для остальных DataGridView;
Знакомство с членом FormattedValue;
Урок 25 -Создание нового дебитора, BLL
Продолжительность: 14,5 минут
Здесь мы на уровне BLL займемся созданием функциональности по добавлению нового дебитора.
Создаем форму для добавления нового дебитора;
Внедряем принцип инкапсуляции путем создания соответствующих открытых для чтения свойств дебитора;
Определяем первые проверки на допустимость данных при нажатии на кнопке сохранения дебитора;
Вызываем форму добавления нового дебитора из пункта главного меню;
Генерируем новую строку и наполняем её данными нового дебитора;
Добавляем новую строку в объект DataTable;
Пытаемся занести изменения в БД на сервере путем вызова еще не существующего пока метода уровня DAL.
Урок 26 -Глубокая настройка адаптеров
Продолжительность: 14 минут
В этом уроке мы долго будем настраивать адаптер и потом быстро его использовать
Какие команды следует определить для гибкого использования адаптера?
Используем объект SqlCommand для определения свойства InsertCommand SqlDataAdapter;
Создание и настройка сложных параметров для адаптера используя тип SqlParameter;
Урок 27 - Автоадаптеры через SqlCommandBuilder
Продолжительность: 18 минут
В этом уроке мы научимся методу быстрой автоматической настройке адаптеров
Почему метод Update следует помещать в конструкцию try/catch?
Как можно использовать данные возвращаемые методом Update?
Тестирование адаптера дебиторов;
Понимаем необходимость настройки команд удаления и изменения данных;
Используя объект SqlCommandBulder генерируем для адаптера свойства команд Delete и Update;
Три важных условия, которые должны быть соблюдены для возможности использовать CommandBuilder.
Урок 28 -Создание нового кредита, BLL
Продолжительность: 22,5 минут
Здесь мы реализовываем интерфейс по выдаче кредита существующему/новому дебитору
Создаем форму для создания нового кредита;
Создаем соответствующий конструктор и необходимые открытые только для чтения свойства;
Работаем с генератором псевдослучайных чисел - классом Random.
Генерируем строку нового кредита и заносим её в объект DataTable;
Опять работаем с событиями TextLeave и TextChanged.
Решаемся на передачу объекта DataSet в дочернюю форму для быстрого заполнения элементов ListBox.
Урок 29 -Создание нового платежа, BLL
Продолжительность: 11,5 минут
В этом уроке мы разрабатываем пользовательский интерфейс для приема платежа
Создаем объект DataView, представляющий все кредиты дебитора;
Создаем необходимы открытые для чтения свойства класса;
Предусматриваем множественные ситуации не правильного заполнения требуемых полей формы перед приемом платежа;
Настраиваем выдачу сообщений о произведенных нарушениях.
Урок 30 -Загрузка связанных ListBox
Продолжительность: 12 минут
В этом уроке мы займемся загрузкой данными ListBox на форме приема платежа
Реализовываем DataSource для всех трех ListBox-ов кредита;
Зачем подписываться на событие SelectedIndexChanged для ListBox?
Настраиваем фильтры для отбора кредитов заданного дебитора;
Реализация функциональности кнопки сохранения данных принимаемого платежа.
Урок 31 -Завершение настройки BLL
Продолжительность: 18 минут
Здесь мы работаем над участком кода, отвечающего за формирование дополнительной строки в объекте DataTable платежей
Создание строки нового платежа и заполнение её данными из открытых свойств формы нового платежа;
Добавление новой строки в объект DataTable платежей;
Предусматриваем вылов исключительных ситуаций;
Определяем ошибки в работе кода и добиваемся правильной его работы;
Урок 32 -Принимая платеж, изменяем параметры кредита
Продолжительность: 10 минут
В этом уроке мы добъемся правильного принятия платежа с учетом изменяемых данных во всех таблицах
Осмысление вопроса о нахождении требуемой строки в таблице кредитов для правильного внесения платежа по кредиту;
Знакомство с методом GetParentRow;
Варианты использования метода GetParentRow с различным представлением внешней связи;
Используя методы BeginEdit и EndEdit вносим соответствующие изменения в поле Balance таблицы кредитов;
decimal.Parse выручает при конвертации денежных единиц;
Досадное исключение ArgumentNullException;
Знакомство с методом GetChildeRows;
Урок 33 - Метод Find и первичные ключи
Продолжительность: 9 минут
В этом уроке мы узнаем о другом, более удобном способе выполнения поиска в родительской/дочерней таблице
Особенности использования метода Find;
Зачем для имеющихся таблиц определять первичный ключ, что дает это на поиске?
Класс PrimaryKey - создание первичных ключей на основе объектов DataColumn;
Обязательноая настройка свойства DataColumn.Unique для определения первичного ключа.
Урок 34 -Изменяем архитектуру приложения, сложный адаптер
Продолжительность: 22 минуты
Здесь мы занимаемся созданием сложного составного адаптера для перкладывания своей работы на плечи адаптера
Почему мы должны следить за всеми изменениями в существующих объектах DataTable клиента?!
Перестаем изменять значения в соответствующей строке таблицы кредитов при приеме платежа;
Выбрасываем кусок кода, связанный с сохранением целостности данных в БД;
Почему теперь мы не можем использовать объект SqlCommandBuilder?
Преобразовываем адаптер для платежей на выполнения двух запросов у свойства InsertCommand и настраиваем соответствующие параметры;
Вносим последние изменения в урове BLL для правильного и четкого срабатывания внесения нового платежа по кредиту.
Урок 35 -Реализация отложенного сохранения внесенных изменений
Продолжительность: 17,5 минут
Здесь мы реализовываем отложенную модель сохранения накопленных на клиенте изменений.
В чем выгоды работы приложения по отложенной модели сохранения изменений в БД сервера;
Создание новой формы, отображающей все измененные данные, выполненые со времени последнего сохранения данных в БД;
Создаем кнопки для сохранения в БД изменений, отмены всех выполненных изменений и отказа от немедленного сохранения;
Стандартно используем классы DataView и DataGridView для отображения всех добавленных строк;
Создаем и запускаем из главной формы форму демонстрации измененных строк;
Подписываемся на событие Load для осуществления мгновенного закрытия формы в случае отсутствия данных для сохранения.
Урок 36 -Тестирование исходного кода
Продолжительность: 5,5 минут
В этом уроке мы отлавливаем все ошибки, допущенные при разработке кода
Тестируем-тестируем наш код.
Урок 37 - Упрощение логики DAL с помощью хранимой процедуры
Продолжительность: 5,5 минут
В этом уроке мы заменяем текстовый запрос составного адаптера хранимой процедурой
Изменяем свойство CommandType в значение StoredProcedured;
Настраиваем текст команды адаптера на имя хранимой процедуры;
Создаем хранимую процедуру;
Радуемся, что нет необходимости изменять объекты входныч параметров.
Урок 38 -Реализация поиска и локального сохранения данных
Продолжительность: 18,5 минут
Здесь мы создадим функциональность поиска и локального сохранения данных
Определяемся с задачами, выполняемыми при проведении поиска по данным;
Определяемся с тем, где мы можем использовать оператор Like, где =, а где придется производить конвертацию типов;
Формируем строку запроса для DataView поисковика;
Создаем маленький код для локального сохранения БД в формате xml.
Урок 39 -Дополнительная оптимизация кода
Продолжительность: 9,5 минут
В этом уроке мы значительно оптимизируем и упрощаем код для получения измененных данных
Уменьшение объема кода путем использования метода DataSet.GetChanges;
Отлаживаем работу полученного кода
Другие перегрузки метода GetChanges.
Урок 40 -Знакомство с мастерами связывания данных
Продолжительность: 14,5 минут
В этом уроке мы познакомимся с мастерами по подключению и привязке данных на визуальные конролы
Почему Вы сейчас наменя обидетесь :) ?
В чём удобство и в чем недостаки использования мастеров привязки данных?
Быстро кидаем на форму три объекта DataGridView и один BindingSource;
Настраиваем через мастер объект BindingSource. Свойство DataSource;
Первое знакомство с типизированным DataSet;
Привязываем первый DataGridView на соответствующее свойство BindingSource;
Привязываем остальные DataGridView и получаем динамическую связь каждого DataGridView;
Настройка привязки к данным DataGridView без непосредственного создания объекта BindingSource.
Урок 41 -Работа с элементом управления BindingNavigator
Продолжительность: 19,5 минут
Здесь мы работаем с интересным аизуальным элементом управления BindingNavigator.
Добавление BindingNavigator на форму;
Связывание BindingNavigator c BindingSource;
Обзор возможностей BindingNavigator;
Добавление в BindingNavigator дополнительных кпопок;
Тонкая настройка кнопок управления навигатора;
С помощью строго типизированного DataSet и DataAdapter реализуем функцию кнопки сохранения данных;
аналогично реализовываем функцию кнопки удаления строк.
Почему мы отключили стандартный обработчик события кнопки удаления?
Определяем собственную логику удаления данных;
Используя метод GetChildeRows находим связанные записи в дочерних таблицах;
Проверяем правильность работы метода удаления строк.
Урок 42 -Автоматическая связь TextBox и активной строки в DataGridView
Продолжительность: 6 минут
Из этого урока мы узнаем как легко и быстро завязать TextBox на динамическое отображение данных из DataGridView
Набрасываем на форму необходимые текстовые поля;
Вызываем мастер Formatting And Advanced Binding для завязки первого TextBox;
Аналогично проводим те же действия относительно остальных TextBox;
Еще несколько слов о мастерах привязки.
Урок 43 - Выпадающий DataGrid - вся БД в одном гриде
Продолжительность: 10 минут
В этом уроке мы реализуем красочный вывод всей связанной информации в одном гриде - выпадающие строки
Постановка задачи относительно выпадающего элемента представления;
Анализ вариантов реализации данной идеи;
Добавляем на форму устаревший элемент DataGrid, настраиваем его свойства;
Настраиваем название DataGrid, его размеры и позицию размещения на форме;
Создание объекта DataViewManager
Назначаем DataGrid соответствующий DataSource;
Указываем гриду первостепенную таблицу, правильное указание свойства DataMember;
Демонстрация работы выпадающих дочерних строк в DataGrid.
Перейти к форме заказа
ADO.NET (Typed DataSet)
Меню раздела 4.
В этом разделе мы мы очень серьезно остановимся на работе со строго типизированным DataSet. На его основе мы разработаем приложение, представляющее собой реально работающий проект, в котором вся работа с данными ведется только через типизированный объект DataSet и его типизированные составляющие.
В раздел вошел 71 урок.
Урок 1 - Разбор технического задания
Продолжительность: 9,5 минуты
В этом уроке мы разберем техническое задание на разработку проекта книжной библиотеки
Знакомство с проектом
Постановка задачи;
Определение с объектами проекта;
Определение взаимоотношений между составляющими разрабатываемого проекта;
Выяснение ограничений, накладываемых на составляющие предмета проекта;
Определение ролей и прав при работе с готовым решением;
Урок 2 -Моделирование структуры БД
Продолжительность: 19,5 минут
В этом уроке мы создадим правильную структуру базы данных книжной библиотеки
Первый псевдовариант структуры БД;
Причины отказа от первой версии;
Выяснение общего и индивидуального в каждом объекте книжной библиотеки;
Создание первой таблицы;
Определение места и способа для хранения дополнительной информации;
Определяемся со второй таблицей...;
Определяемся с третьей таблицей и создаем связи между таблицами;
Заевршаем создание таблиц БД и их взаимосвязей. Анализируем полученную структуру.
Урок 3 - Реализация БД на сервере
Продолжительность: 9,5 минут
В этом уроке мы реализуем разработанную в предыдущем уроке БД на SQL-Server
Набиваем все необходимые таблицы;
Определямся с первичными ключами и уникальными значениями соответствующих столбцов.
Урок 4 - Создание связей между таблицами
Продолжительность: 7 минут
В этом уроке мы завершаем создание серверной БД и из дизайнера создаем все требуемые связи
Создаем визуальную диаграмму таблиц;
Генерируем недостающие внешние отношения между всеми таблицами;
Проверяем существующие Relations на достаточность.
Урок 5 -Создание классов сущностей библиотеки
Продолжительность: 11,5 минут
В этом уроке мы начнем создавать необходимые пользовательские классы, представляющие существующие сущности библиотеки
Создание проекта Librury;
Знакомство с понятием типа уровня классов Common;
Зачем существуют классы уровня Common и как он завязан с остальными уровнями?
Создаем тип Item;
Понимаем необходимость указания типа Item абстрактным классом.
Урок 6 -Пользовательский класс Book
Продолжительность: 17,5 минуты
В этом уроке мы разработаем и реализуем тип Book
Определяемся с наследственностью данного класса;
Создаем личные поля для класса Book;
Определяем какие поля должны присутствовать в данном классе, а какие нет;
Понимаем назначение дополнительных свойств-коллекций типа Dictionary;
Создаем несколько перегрузок конструктора для "лестничного" их вызова.
Урок 7 -Пользовательский класс Article
Продолжительность: 15 минут
В этом уроке мы создадим тип Article
Создаем класс Article;
Выполняем аналогичный предыдущему классу анализ и его внедрение в классе Article;
Урок 8 -Пользовательский класс Magazine
Продолжительность: 9 минут
В этом уроке создадим тип Magazine
Повторяем все, уже привычные, действия для класса Magazine.
Урок 9 -Создание строго типизированного DataSet
Продолжительность: 9 минут
Здесь мы создадим строго типизированный DataSet-копию серверной БД
Строим диаграмму классов и анализируем полученные результаты;
Знакомство с вариантом разработки классов из дизайнера диаграммы классов;
Первый ручной вариант создания строго типизированного DataSet;
Автоматическое создание типизированного DataSet, представляющего точную копию структуры серверной базы данных Librury;
Анализируем полученный типизированный DataSet;
Изучение структуры типизированного DataSet в визуальном редакторе;
Выявление преимуществ в работе с типизированным DataSet.
Урок 10а -Создание подуровня DAL - провайдера
Продолжительность: 13,5 минут
В этом уроке мы создадим вспомогательный класс Provider
Зачем уровню DAL помощник в качестве провайдера?
Определяемся с взаимоотношениями между провайдером и уровнем доступа к данным;
Генерируем 9 строго типизированных адаптеров;
По какой причине следует отказать от использования готовых типизированных адаптеров и создать собственные?
Декларируем собственные адаптеры;
Начинаем разработку метода по загрузке строго типизированного DataSet.
Урок 10б -Отказ от типизированных адаптеров
Продолжительность: 13 минут
В этом уроке мы продолжаем разработку провайдера
Зачем нам создавать массив типа DataTable для хранения всех строго типизированных объектов-таблиц строго типизированного объекта DataSet?
Применив всего несколько строк кода создаем и полностью задаем все 9 адаптеров!
Опять двумя строками добиваемся функциональности по загрузке данными через адаптеры всех соответствующих таблиц.
Урок 11 -Завершение создание уровня провайдера
Продолжительность: 7,5 минут
В этом уроке мы заканчиваем с разработкой класса адаптера
Определяемся с режимом передачи требуемых данных в/из провайдера;
Создаем метод сохранения в БД изменений данных;
Вариант сохранения изменений в SQL-Server БД;
Вариант сохранения изменений в формате xml.
Урок 12 -Добавление уровня DAL
Продолжительность: 12,5 минут
В этом уроке мы начнем разработку уровня DAL
Повторное анализирование имеющейся на сегодняшний день архитектуры приложения;
Создание нового уровня по доступу к данным DataSet;
Определение нагрузки, которую должен нести создаваемый уровень DAL;
Подключаем необходимые ссылки на сборки пользовательских типов;
Создаем открытые свойства и закрытые поля уровня DAL;
Создаем простенький конструктор.
Урок 13 -Методы получения книг из провайдера
Продолжительность: 23 минуты
В этом уроке мы зададимся созданием методом получения всех книг из БД
Понимаем необходимость разбивки уровня DAL на множество файлов;
Создаем partial класс для работы с данными книг;
Создаем метод получения всех книг;
Используем тип DataRowCollection для хранения всех записей из таблицы Books;
Как получить всю недостающую информацию о книге из других таблиц?
Определяемся с вспомогательным методом получения недостающей части книги;
Получаем ссылку на соответствующую запись в родительской таблице Items;
Вытягиваем из таблицы Items остальную часть информации о конкретной книге;
Определяемся с типом возвращаемого значения из метода - List<Book>
Получаем ссылку на запись в родительской таблице Authors и вытягиваем информацию об авторе книги.
Урок 14 -Еще пример подобного метода
Продолжительность: 15 минут
В этом уроке мы рассмотрим другой вариант метода получения недостающих частей книги
Используем метод Select для получения всех записей из таблицы Books;
Получаем весь набор строк книг в типе DataRow, а не DataRowCollection;
Создаем метод на прием массива строк типа DataRow[];
Выгоды неявного преобразования общего типа в строго типизированные строки;
Как правильно записать метод Select для таблицы Items на вытягивание соответствующей строки для дочерней записи в таблице Books, используя внешний ключ?
Особая роль первичного ключа в возможности использования методов поиска и выборки строк в дочерних/родительских таблицах;
Вытягиваем недостающую информацию из таблицы авторов.
Формируем список List готовых к отправке на клиент книг;
Анализируем обе перегрузки метода по получению недостающих частей книги и определяемся с какой из них будем дальше работать.
Урок 15 -Форма выбора источника данных
Продолжительность: 11 минут
В этом уроке мы создадим форму по предварительному выбору источника данных для запуска приложения
Знакомство с возможным графическим интерфейсом формы выбора источника данных;
Создаем данную форму и набрасываем на неё панельки с соответствующими контролами;
Реализовываем автоматическое заполнение необходимых параметров требуемой строки подключения к БД;
Создаем открытое совйство, представляющее параметры строки подключения;
Событие ChackedChanged для манипулирования доступом панелей;
Тестируем работу форы по подключению к SQL-Server.
Урок 16 -Расширение удобства UI формы
Продолжительность: 12 минут
В этом уроке мы продолжаем разрабатывать функционал формы подключения к требуемому источнику данных
Реализуем процесс выхода из приложения для кнопки Cancel;
Организация Windows Autentication;
Организация аутентификации, используя логин и пароль;
Отладка процесса соединения с сервером базы данных.
Урок 17 -Распределение функциональности контролов
Продолжительность: 7,5 минут
В этом уроке мы еще больше подвешиваем функциональности на нашу форму
Реализовываем автоматическое деактивацию/активацию соответствующих TextBox в зависимости от действий пользователя;
Завершаем с процессом настройки подключения к серверу БД;
Используем тип OpenFileDialog для предоставления пользователю возможности выбора локального файла БД
Настройка контрола OpenFileDialog на отображение только файлов формата XML;
Дополнительная проверка выбранного типа файла в качестве источника данных.
Урок 18 -Завершение настройки функциональности формы
Продолжительность: 9 минут
В этом уроке мы наконец то формируем конечные параметры для передачи их на уровень DAL для выполнения соединения с источником данных
Проверяем элемент RadioButton для определения типа БД для последующего установления соединения;
Формируем универсальную строку подключения в составе с определенным пунктом создаваемого теперь пользовательского перечисления.
Урок 19 -Пользовательский интерфейс клиента
Продолжительность: 15 минут
В этом уроке мы создадим пользовательский интерфейс для пользователя
Создание вкладок для разделения книг и журналов;
Дорабатываем провайдер и устраняем недочеты;
Долго-долго тестируем и отлавливаем возможные исключительные ситуации в соединении с сервером БД;
Завязываем DataGridView на список книг типа List<Book>.
Урок 20 - Настройка работы DataGridView книг
Продолжительность: 12,5 минут
В этом уроке мы настраиваем правильный вывод книг в объекте DataGridView
Порядок занесения данных книг в таблицы БД;
Выясняем откуда в DataGridView появляются непредвиденные и пустые столбцы;
Определяемся каким образом стоит решить данную простенькую проблему;
Предотвращаем вывод DataGridView лишних столбцов;
Знакомство с элементом управления MaskedTextBox;
Примеры настройки MaskedTextBox;
Зачем нам вручную вызывать обработчик события нажатия на кнопке перепривязки данных?
Урок 21 -Работа над кнопкой "Rafresh"
Продолжительность: 15 минут
В этом уроке мы завершаем с кодом кнопки поиска и привязки книг "Refresh"
Расширяем условие поиска для кнопки Refresh;
Определяем псевдоусловия выполнения оператором поиска всех книг без условий;
Зачем настройку DataGridView книг мы настраиваем уже только в обработчике события нажатия на кнопке "Refresh"?
Привязываем к гриду найденные книги;
Генерируем соответствующий метод поиска книг уровня DAL.
Урок 22 -DAL - сложный поиск книг
Продолжительность: 15 минут
В этом уроке мы начнем разработку метода поиска книг уровня DAL
Обобщение имеющегося на данный момент кода;
Долго определяемся с типом поиска;
Выясняем в каком порядке и по каким таблицам правильнее всего будет проводить поиск книг;
Получаем набор строк из таблицы Items, удовлетворяющих условию поиска;
Получаем набор строк из таблицы авторов, удовлетворяющих условию;
Почему искать книги в "родной" таблице Books не стоит?
Зачем мы ищем записи в таблицах Items и Authors отдельно друг от друга?
Урок 23 -Заканчиваем с методом поиска
Продолжительность: 17,5 минуты
В этом уроке мы заканчиваем с реализацией метода поисковыой выборки книг уровня DAL
Из обычного массива строк получаем обобщенную коллекцию строго типизированных строк таблицы Items;
Получаем пустую обобщенную коллекцию строго типизированных строк таблицы Book;
Используем строго типизированный метод для получения всех дочерних записей из текущей;
Но почему нас интересует лишь первый элемент полученных наборов искомых строк?
Отличнейший метод FindAll и пример применения лямбда выражения для быстрого построения фильтра выборки требуемых элементов.
Урок 24 -Метод формирования строки поиска
Продолжительность: 16,5 минут
В этом уроке мы реализовываем важный универсальный метод для формирования строки запроса
Обязательное повторение всего того, что мы реализовали;
Создаем универсальный метод для формирования строки фильтра, используемого во всех методах поиска чего-либо;
Тип Dictionary позволяет реализовать данную затею;
Тип KeyValuePair для проведения итератора по словарю;
Используя операторы Like и AND формируем универсальную строку выборки.
Урок 25 -Самостоятельное нахождение ошибки
Продолжительность: 2,5 минут
В этом уроке Вы самостоятельно найдете некритическую ошибку, возникающую при выполлнении поиска книг
Подсказка относительно типа возможной ошибки и места её возникновения.
Урок 26 -Добавление новой книги - UI, BLL
Продолжительность: 9,5 минут
Здесь мы займемся функциональностью формы по добавлению новой книги в БД
Создание формы добавления новой книги и набрасывания на неё контролов;
Создание открытого свойства для получения главной формой данных о новой добавляемой книге;
Проверка визуальных контролов на предмет заполненности валидными значениями;
Создаем объект типа MenuStrip и подписываемся на событие выбора пункта меню добавления книги.
Урок 27 -Расширение функционала формы новой книги
Продолжительность: 8,5 минут
В этом уроке мы улучшаем юзабельность формы новой книги и также обеспечиваем это соответствующим кодом
Вызываем загрузку формы новой книги из главной формы;
Добавляем на форму вывод только что сформированных новых книг-кандидатов на сохранение в БД;
Реализуем автоматическую проверку присутствия в списке кандидатов на добавление книг, пытающихся добавить повторно;
Опять симулируем вызов события нажатия кнопки "Refresh"?
Урок 28 -Сохранение новых книг в БД, DAL
Продолжительность: 19 минут
В этом уроке мы завершаем с методом внесения новых книг в типизированный DataSet
Предусматриваем возможность передачи в уровень DAL пустой коллекции кандидатов на сохранение
Определяемся какие изменения следует внести в таблицы БД при добавлении той, или иной книги;
Особое внимание уделяем информации об авторе книги;
В каких случаях мы получаем ссылку на строку в таблице авторов, а когда нет необходимости делать это?
Предполагаем наличие метода для выяснения уникальности добавляемой в БД книги;
Получаем ссылку на запись таблицы Items;
Получаем ссылку на запись в таблице Authors;
Через строго типизированные методы добавляем новые строки в типизированный DataSet;
Самое интересное - создаем новую строку в дочерней таблице с указанием внешних ключей по родительским таблицам, - минимум кода - максимум эффективности!
Урок 29 -Метод определения уникальности книги
Продолжительность: 15 минут
В этом уроке мы создадим метод, определяющий уникальность книги в БД
Определяемся с входными параметрами метода;
Обнаруживаем целесообразность принятия одного из параметров с модификатором out;
Метод Select - наконец то ищем по таблице Books;
Зачем мы производим поиск также по таблице Authors?
Используя строго типизированный метод для каждой записи из таблицы авторов получаем список дочерних записей таблицы книг;
Тестируем полученный код.
Урок 30 -Создание UI обновления книги
Продолжительность: 8 минут
В этом уроке мы начнем создавать форму по обновлению существующих в БД книг
Разбираемся с проблемой формы по неоднократному созданию новой книги;
Тестируем полученный код;
Создаем форму по обновлению существующей книги;
Автоматическое заполнение TextBox информацией обновляемой книги;
Реализуем соответствующий пункт главного меню и определяемся с режимом вызова конструктора формы по обновлению книги.
Урок 31а -Разработка BLL обновления книги
Продолжительность: 12 минуты
В этом уроке мы продолжаем разработку логики форм для обновления существующей книги
Определяемся с объектом, передаваемым в конструктор формы обновления книги;
Взвешиваем все "ЗА" и "ПРОТИВ" относительно кандидатов на параметр передачи;
Создаем объект "старой книги";
Создаем объект "новой книги";
Создаем необходимые свойства обновляемой книги;
Реализуем логику обработчика события загрузки формы обновления книги;
Запускаем данную форму из главной для проведения небольшого теста;
Загружаем открытые свойства обновляемой книги из родительской формы.
Урок 31б -Завершение создания BLL обновления книги
Продолжительность: 11,5 минут
В этом уроке мы наполняем логику кода по изменению книги способностью определения допустимости принятия новых значений
Определяем поля, возможные для изменения;
Анализируем способ идентификации строки, подлежащей для обновления;
Роль первичного ключа в процессе определения и нахождения книги для обновления;
Почему идентификация происходит только по уникальному ключу?
Предусматриваем вывод сообщений при введении в TextBox не валидных данных;
Обязательно проверяем предлагаемые значения деталей книги на соответствие/не соответствие с предыдущими.
Урок 32 -Разработка клиента обновления книги
Продолжительность: 9,5 минут
В этом уроке мы продолжае заниматься работой над обновлением книги
Решаем, что изменять существующие книги стоит по отдельности, а не все вместе;
Зачем для единственной книги мы определяем список List типа Book;
Заполняем список обновляемых книг на главной форме;
Заполняем список обновляемых книг и передаем его в уровень DAL;
Тестируем полученный код.
Урок 33 -Обновление книги, DAL
Продолжительность: 18,5 минуты
В этом уроке мы реализуем логику сохранения изменений книги на уровне DAL
Постановка вопроса о способе обновления книги на сервере БД;
Выяснение подводных камней в процессе обновления книги;
Обсуждаем необходимость предварительного выполнения нескольких ключевых проверок;
Опять таки, определяем способ идентификации книги для изменения её данных;
Метод FindByID для выборки записей из таблицы Items;
Изменяем соответствующие поля полученной записи;
Добавление новой строки в таблицу авторов, или получение существующей строки;
Находим строку таблицы Books также по методу FindByID;
Изменяем значения полей строки из таблицы книг;
Тестируем пользовательский интерфейс;
Подводим итоги полученного кода.
Урок 34 -Универсальность метода проверки уникальности
Продолжительность: 20 минут
В этом уроке мы расширяем логику метода определения уникальности книги для использования его в различных условиях
Создаем пользовательское перечисление;
Вносим дополнительный входной параметр в метод определения уникальности книги;
Расширяем логику метода проверки уникальности для отличий в определении уникальности записи в зависимости от требуемых последующих действий с ней;
Долго-долго тестируем работу приложения на функциональности обновления книг.
Урок 35 -Тестирование исходного кода
Продолжительность: 9,5 минут
В этом уроке мы продолжаем процесс тестирования исходного кода
Расставляем точки останова для пошагового выполнения приложения;
Добавляем в пользовательский интерфейс вывод количества добавляемых книг.
Урок 36 -Создание журналов, DAL
Продолжительность: 13,5 минут
В этом уроке мы начнем создавать функциональность по добавлению новых журналов
Переносим универсальный метод формирования строки запроса к DataSet в другой файл того же класса;
Создаем новый файл по журналам для расширения partial класса уровня DAL;
Массив DataRow - получаем все строки журналов методом Select;
Определяем ключевые моменты по получению недостающей информации по журналам;
Аналогично для книг реализовываем метод получения недостающей информации по журналам.
Урок 37 -Функционал кнопки "Search" для журналов
Продолжительность: 10 минут
В этом уроке мы начинаем реализовывать функциональность по поиску журналов
Добавляем на форму дополнительную кнопку поиска журналов;
Особенности в процессе поиска журналов по БД;
Проверяем состояние поисковых TextBox;
Определяем момент необходимости выполнения реального поиска;
Создаем объект-прототип искомой книги;
Настраиваем вывод столбцов DataGridView журналов.
Урок 38 -Вывод всех журналов в DataGridView
Продолжительность: 11 минут
В этом уроке мы добиваемся правильного вывода всех журналов в соответствующий DataGridView
Симулируем нажатие кнопки "пустого" поиска книг;
Проходим по точкам процесс создания нового журнала для выявления досадного недочета относительно выводимых столбцов DataGridView;
Тестируем работу книг для определения проблем с журналами;
Анализируем работу конструкторов для определения проблем с модификаторами доступа!
Вносим незначительную поправку и наслаждаемся правильной работой приложения.
Урок 39 -Поиск журналов, DAL
Продолжительность: 21 минута
В этом уроке мы занимаемся непосредственно методом поиска журналов на уровне DAL
Находим массив строго типизированных строк из таблицы Items посредством вызова метода Select со сгенерированной строкой запроса;
Метод ToList - зачем понадобилось получение из массива обобщенного списка?
Создаем обобщенный список строго типизированных строк таблицы журналов;
Выполняем итератор по строкам таблицы Items для получения дочерних строк таблицы Magazines;
Опять применяем лямбда выражения для отбора требуемых строк;
Обратная конвертация с помощью метода ToArray;
Предача полученных результатов в метод выборки недостающей информации по журналам;
Тестируем работу поиска журналов.
Урок 40 -Функционал кнопки "Search" для статей
Продолжительность: 10 минут
В этом уроке начинаем разработку логики по поиску статей
Добавляем контрол Button на вкалдку статей;
Определяем условия выполнения "пустого" поиска статей;
Определяем условия реального поиска статей;
Определяемся с критериями поиска статей;
Создаем неполный прототип статьи поиска;
Какие трудности ожидают нас при формировании условий поиска статей? В чем отличие от поиска журналов?
Настраиваем DataGridView статей на правильное отображение столбцов.
Урок 41 -Получение всех статей, DAL
Продолжительность: 19,5 минут
В этом очень интересном уроке мы разработаем метод по получению всех статей, учитывая сложные взаимосвязи последних с журналами
Создаем новый файл уровня DAL, отвечающий за работу со статьями;
Аналогично для книг разрабатываем метод выборки всех статей из DataSet;
Использование внешних связей, формирующих отношение "Многие-Ко-Многим", выбираем всю не достающую информацию по связанным таблицам;
Еще раз анализируем структуру взаимосвязей БД.
Урок 42 -Поиск статей, DAL
Продолжительность: 19,5 минут
В этом уроке мы создадим метод реального поиска статей на уровне DAL
Причина исключительной ситуации в отсутствии данных в некоторых таблицах БД;
Наполняем таблицы реальной информацией;
Аналогично к книгам и журналам создаем метод поиска статей;
Отличительные особенности в логике поиска статей над журналами и книгами;
Что обязательно следует учесть при поиске статей, завязанных на таблице журналов?
Опять выручают строго типизированные внешние связи таблиц журналов и статей.
Урок 43 - Создание нового журнала, BLL
Продолжительность: 14 минут
В этом уроке мы создаем форму для добавления в БД новых журналов
Создаем форму для создания нового журнала;
Набиваем привычную логику для получения объекта нового журнала, списка новых журналов и установкой соответствующих открытых свойств для использования в главной форм;
Создаем пункт главного меню для запуска формы по добавлению новых журналов;
Реализуем логику главной формы по вызову и принятию данных от формы новых журналов;
Выполняем проверку принятия дубликата и тестируем полученный код.
Урок 44 -Создание нового журнала, DAL
Продолжительность: 12,5 минут
В этом уроке мы работаем над улучшением качества процесса сохранения новых журналов в БД
Создаем метод сохранения в DataSet новых записей журналов;
Создаем новую форму, отображающую не добавленные журналы;
Определяемся с местом вызова формы по отображению не добавленных журналов;
Заканчиваем с методом сохранения журналов уровня DAL.
Урок 45 -Определение уникальности журнала
Продолжительность: 18 минут
В этом уроке мы разрабатываем метод по определению уникальности журнала и исправляем недочеты предыдущего урока
Выясняем способ определения уникальности добавляемого журнала;
Анализируем таблицы, представляющие журнал;
Что должно быть уникальным в журнале для сохранения его уникальности?
Что общего могут иметь два уникальных журнала?
Реализовываем логику определения уникальности журнала и исправляем ошибки в методе сохранения журнала в БД. Тестируем код.
Урок 46а -Добавление новой статьи, UI
Продолжительность: 12 минут
В этом уроке мы создаем форму и её контролы для добавления новой статьи
Создание новой формы и набрасывание на неё контролов;
Определяемся с компонентами журнала для передачи в качестве параметра в конструктор формы;
Вопрос о заполнении журналами выпадающего списка формы новой статьи;
Реализуем обработчик события выбора определенного журнала в выпадающем списке;
Зачем нам понадобилось создавать пользовательский делегат и на его основе регистрировать пользовательское событие?
Урок 46б -Добавление новой статьи, BLL
Продолжительность: 12 минут
В этом уроке мы продолжаем реализовывать логику BLL по добавлению новых статей
Реализуем метод добавления в буфер новой статьи;
Заполняем список имен журналов;
Заполняем список номеров журналов;
Выполняем проверки на валидность внесенных данных новой статьи.
Урок 47 -Подготовка сохранения журнала в БД, DAL
Продолжительность: 14 минут
В этом уроке мы работаем над методами-заполнителями выпадающих списков названий и выпусков журналов
На уровне DAL создаем метод, получающий имена всех журналов БД;
Применяя метод Distinct отбираем уникальные названия журналов из списка записей всех журналов и приводим к обобщению методом ToList;
Реализовываем метод по получению всех номеров (выпусков) конкретного журнала.
Урок 48 -Добавление новой статьи, UI, BLL
Продолжительность: 20,5 минут
Здесь мы продолжаем создание законченной логики по созданию новой статьи
Добавляем новый пункт меню;
Обработчик события пункта меню по открытию формы создания новой статьи;
Хитрый способ назначения DataSource для ListBox выпусков текущего журнала из главной формы;
Вылов ошибок при заполнении первого ListBox;
Длительное тестирование полученного кода.
Урок 49 -Сохранение новой статьи в БД, DAL
Продолжительность: 16 минут
В этом уроке мы создадим метод уровня DAL по добавлению новой статьи в DataSet
Выполняем все аналогичные действия по созданию метода добавления новых записей по статьям;
Добавляем логику по внесению изменений в промежуточную таблицу, связывающую журналы и статьи;
Понимаем, что добавление статьи является ни чем иным, как добавление связей с журналами;
Генерируем метод проверки уникальности статьи.
Урок 50а -Определение уникальности статьи
Продолжительность: 13,5 минут
В этом уроке мы начинаем создание метода проверки уникальности статьи
Выполняем проверки по автору добавляемой статьи;
Проверяем наименовани подобной статьи в данном номере данного журнала;
Зачем для данного журнала получать все выпуски?
Урок 50б -Завершение определения уникальности статьи
Продолжительность: 13 минут
В этом уроке мы заканчиваем с разработкой метода проверки уникальности статьи
Выясняем правила определения возможности помещения статьи в данный номер журнала;
Что следует проверить в первую очередь для избавления себя от излишних проверок в будущем?
Получаем все статьи в данном номере журнала;
Проверяем названия всех полученных статей на совпадение с добавляемой;
Тестируем полученный код.
Урок 51 -Анализ объекта копий в структуре БД
Продолжительность: 12 минут
В этом уроке мы начинаем работу с копиями объектов библиотеки
Разбираем понятие копии книги, журнала в БД;
Что может быть выражено в качестве копии объекта?
Как выдавать копию книги?
Как выдавать копию журнала?
А как выдавать копию статьи?
Анализ таблицы копий;
Создаем общий тип Copy;
Накидываем открытые свойства в классе копии;
Реализовываем окнструктор.
Урок 52 -Получение копий книг, DAL
Продолжительность: 17 минут
В этом уроке мы зададимся методом получения всех копий книг БД
Определяемся со способом получения копии книги;
Определяемся с идентификатором копии книги;
Создаем метод нахождения всех копий данной книги;
Определяем out параметр имени книги, зачем?
Методы Select и Find для получения копий, находящихся в пользовании и копий, находящихся в библиотеке;
Еще два способа получения копий. Выбираем лучший из них;
Формируем список копий книг.
Урок 53 -Форма выдачи копии книги, UI, BLL
Продолжительность: 12 минут
В этом уроке мы разработаем логику отображения копий книг разного статуса
Создаем форму отображения копий книг;
Создаем конструктор формы и определяем необходимые входные параметры;
Выполняем привязку данных ко всем визуальным контролам на форме;
Предложение закрашивания строк, представляющие недоступные для выдачи копий, красным цветом;
Пробуем реализовать данную задумку в событии RowPrePaint;
Проверяем заголовочную строку через e.RowIndex;
Используем свойство DefaultCellStyle.BackColor для закрашивания ячейки;
Событие CellEnter - связываем текстовое поле с идентификатором конкретной записи в DataGridView копий;
Управляем доступностью кнопки выдачи копии на руки.
Урок 54 -Работа с объектом "User", UI, BLL, DAL
Продолжительность: 18 минут
В этом уроке мы продолжаем разработку формы по отображению всех копий книги и получению свободной из них
Создаем файл для части юзеров уровня DAL;
Создаем метод для получения списка всех пользователей, зарегистрированных в БД;
ConextMenuStrip - создаем контекстное меню для отображения всех копий книги и подвязываем его к DataGridView книг;
Получаем текущую ячейку над которой было вызвано контекстное меню;
Проверяем работу по отображению всех копий выбранной книги.
Урок 55 -Форма списывания с пользователя книг
Продолжительность: 9 минут
В этом уроке мы создаем форму по списанию с пользователя книг и журналов
Создаем конструктор;
Выводим всю литературу, находящуюся в пользовании пользователя, сохраняя принципы инкапсуляции;
Создаем пользовательское событие и подписываем на него главную форму;
Создаем открытое свойство для DataGridView.
Урок 56 -Отображение книг, находящихся в пользовании пользователя
Продолжительность: 6 минут
В этом уроке мы расширяем логику отображения книг, находящихся в пользовании пользователя
Подписываемся и отписываемся от пользовательских событий;
Дополнительные методы-обработчики событий для связывания данных при выборе конкретного пользователя.
Урок 57 -Определение режима возврата книги
Продолжительность: 7 минут
В этом уроке мы создаем новый тип, представляющий собой копию книги (журнала), находящуюся в пользовании
Интерфейс Enumerable - зачем нам он вдруг понадобился, прекрассно ведь жили без него;
Выбор между типами DataSet, DataTable и List;
Анализируем структуру таблицы Copies;
Еще раз пояснение идеологических отличий между книгой и копиями этой книги;
Создаем новый класс копии пользования;
Создаем свойства для данного типа;
Создаем конструктор и устанавливаем свойства в переданные параметры.
Урок 58 -Получение всех книг у данного пользователя
Продолжительность: 8,5 минут
В этом уроке мы получаем все книги, находящиеся у пользователя на руках
Определяемся с местом реализации метода получения всех книг, находящихся в пользовании текущего пользователя;
Ищем копии книг у пользователя используя идентификатор пользователя;
Выводим все данные на визуальные контролы;
Проверяем работу полученного кода.
Урок 59а - Функциональность по выдаче книг, BLL
Продолжительность: 10 минут
В этом уроке мы наконец то займемся выдачей книг пользователю
Определяем, что выдавать книги следует по одной;
Почему не следует выдавать сразу несколько копий разных книг однопу пользователю?
Создаем объект-копию книги на руках;
Заполняем список книг на руках текущего пользователя;
Создаемм делегат для пользовательского события выдачи книги пользователю.
Урок 59б -Функциональность по выдаче книг, DAL
Продолжительность: 10 минут
В этом уроке мы реализуем логику выдачи книги с пользователя на уровне DAL
Пробегаем по списку выдаваемых книг и находим методом FindByID соответствующего пользователя;
Добавляем новую строку в таблицу выдачей;
Почему при выдаче книги мы не вносим в таблицу копий изменения?
Проверяем работу выдачи книг - выдаем книгу пользователю, наблюдаем изменение состояние копии и переход копии во временное владение пользователем;
Выносим внутреннюю переменную на уровень класса для предотвращения дублирования выданной копии;
Отдаем предпочтение свойству ShowDialog над открытым свойством класса.
Урок 60 -Завершение методов списания книг с пользователей
Продолжительность: 15,5 минут
В этом уроке мы заканчиваем с функциональностью списания книг с пользователя
Анализируем процесс списания копии с пользователя;
Почему не приветствуется удаление записей из таблиц БД?
Добавляем список списываемых книг;
Предотвращение возможности списания одной и той же копии;
Удаляем записи из таблицы копий на руках методом Delete;
Зачем простое удаление строки мы помещаем в блок try/catch?
Урок 61а -Супер операторы Parent и Child в запросах к DataSet
Продолжительность: 11 минут
В этом уроке мы получаем все искомые книги созданием всего одного запроса!!!
Выбираем метод для проведения компрометирующего меня кода, демонстрирующего выгод в использовании методов Parent и Child;
Анализируем имеющиеся логические конструкции по получению типизированных строк определенных объектов библиотеки;
Комментируем исходный код для замены его более простым и меньшим объемом кода;
Используем всего одну конструкцию с методом Select по одной единственной таблице Books для единоразового получения массива строк типа DataRow;
Пояснение на структуре типизированного DataSet назначение ключевого слова Parent;
Синтаксис правильного использования оператора Parent через указание внешнего ключа;
Мгновенный (тут же в запросе) доступ к интересующему полу родительской таблицы;
Оператор Like для построения условия сравнения.
Урок 61б -Супер методы GetChildRows и GetParentRows
Продолжительность: 11 минут
В этом уроке мы получаем знания по максимально быстрой работе с типизированным DataSet, которые мы не могли бы понять без прохождения всего курса!!!
Завершаем с построением полного фильтра (на базе одной дочерней идвух родительских таблиц) на поисковую выборку записей из таблицы Books;
Формируем объекты типа Book через использование метода GetParentRow;
Проверяем полученный код и понимаем удобство данного подхода;
Понимание принципа использования оператора Child для получения доступа к дочерней таблице;
Метод GetChildRows для получения дочерних записей;
И вот наконец то мы приходим к полному пониманию преимущества типизированного DataSet при рассмотрении иных вариантов получения доступа к дочерним и родительским таблицам не через методы GetParentRow, или GetChildeRows, а непосредственно через типизированное свойство.
Урок 62 -Оператор Convert. Создание пользователя, BLL
Продолжительность: 15 минут
В этом уроке мы начнем разработку функциональности по созданию нового пользователя
Изменяем типы полей на DataTime непосредственно в дизайнере типизированного DataSet;
Вносим необходимые изменения в строку фильтра, созданной в последних нескольких уроках;
Возможная замена текстового поля на DateTimePicker и пояснение вариантов работы с ним;
Создание формы нового пользователя и настройка необходимых контролов;
Создание дополнительного пункта меню и реализация привычного кода вызова формы для создания пользователя;
Создаем совйство, инкапсулирующее данные нового пользователя;
Как и всегда, реализовываем проверки ввода валидных данных;
Особое внимание уделяем типу данных для пароля пользовательской учетной записи, почему?
Зачем шифровать пароль и в какой способ следует это делать?
Пояснения принципа создания и шифрования пароля пользователя. Преимущества и недостатки шифрования пароля.
Урок 63 -Алгоритм шифрования паролей для БД
Продолжительность: 10,5 минут
Здесь мы займемся созданием метода для выполнения шифрования пароля
Подключение пространства имен Security.Cryptography;
Выделяем байт-массив из пароля с помощью метода Encoding.Unicode.GetBytes;
Почему мы выбираем алгоритм MD5 для выполнения криптографии?
Зачем мы создали объект типа MD5CryptoServiceProvider?
Метод ComputeHash - вычисляем хеш;
Формируем строку в формате хексагонал;
Лепим из типа string тип Guid для передачи валидного хеша в БД;
Создаем метод добавления пользователя в DataSet на уровне DAL и проводим полное тестирование полученного кода.
Урок 64 -Авторизация пользователей, DAL
Продолжительность: 9 минут
В этом уроке мы занимаемся процедурой авторизации пользователя при входе в систему
Описание процесса авторизации и разграничение ролей пользователей;
Анализ полномочий администратора;
Выяснение функциональности приложения, доступной администратору и не доступной обычному пользователю;
Создаем метод проверки пользователя на уровне DAL;
Получаем требуемого пользователя методом Select и определяем его полномочия.
Урок 65 -Авторизация пользователей, UI, BLL
Продолжительность: 17,5 минут
В этом уроке мы работаем с функциональностью формы атворизации пользователя
Создаем форму авторизации пользователя;
Почему сейчас мы передаем объект DataSet в форму авторизации?
Создаем конструктор для формы авторизации;
Зачем мы опять шифруем введенный при авторизации пароль пользователя?
Для клиента организовываем обработчик события FormLoad;
Выбираем момент запуска формы авторизации;
Преносим симулирующий вызов срабатывания кнопок "Refresh" из конструктора в метод FormLoad;
Управляем доступностью пунктов меню и контектсного меню в зависимости от роли входящего пользователя;
Тестируем полученный код.
Урок 66 -Последние исправления кода авторизации
Продолжительность: 6,5 минут
В этом уроке мы выполняем последние, "бросающиеся в глаза", исправления кода
Хитрый ход для занесения администратора в БД;
Проверяем правильность работы приложения при авторизации администратора и обычного пользователя;
Везде, где необходимо вносим поправки в код.
Урок 65 -Загрузка DataSet из файла xml
Продолжительность: 7,5 минут
В этом уроке мы загружаем данные в DataSet из локального файла БД типа xml
Быстро-быстро автоматически создаем БД в формате xml и xsd;
Вносим временные изменения в код уровня Provider для автоматической генерации файлов с данными формата xml;
Метод WriteXml и метод WriteXmlSchema;
Проверяем присутствие только что созданных файлов xml;
Проверяем работу приложения по режиму загрузки БД и файлов xml и xsd;
Ключевой момент, который следует помнить при выборе варианта загрузки БД в рабочее приложение.
Перейти к форме заказа
Имейте в виду, что однажды освоив базы данных для настольных приложений, вы с такой же легкостью будете использовать знания для построения веб сайтов!
С технической стороны доставки курса, - я по-прежнему несу всю ответственность по доставке данного диска. Это означает, что даже если диск не дойдет до Вас, либо придет в непригодном к использованию состоянии, я вышлю его повторно за свой счет. Пока клиент не получил заказанный курс, он (заказ) находится на особом положении в моей системе учета заказами.