Лабораторный практикум. Лабораторная работа Обследование предметной области Построение модели ide создание контекстной диаграммы Создание диаграммы декомпозиции Создание диаграммы
Скачать 5.73 Mb.
|
11.4 Вложенные транзакции Вложенными называются транзакции, выполнение которых инициируется из тела уже активной транзакции. Для создания вложенной транзакции пользователю не нужны какие-либо дополнительные команды. Он просто начинает новую транзакцию, не закрыв предыдущую. Завершение транзакции верхнего уровня откладывается до завершения вложенных транзакций. Если транзакция самого нижнего (вложенного) уровня завершена неудачно и отменена, то все транзакции верхнего уровня, включая транзакцию первого уровня, будут отменены. Кроме того, если несколько транзакций нижнего уровня были завершены успешно (но 181 не зафиксированы), однако на среднем уровне (не самая верхняя транзакция) неудачно завершилась другая транзакция, то в соответствии с их характеристиками произойдет откат всех транзакций всех уровней, включая успешно завершенные. Только когда все транзакции на всех уровнях завершены успешно, происходит фиксация всех сделанных изменений в результате успешного завершения транзакции верхнего уровня. Каждая команда Если команда 11.5 Пример вложенных транзакций BEGIN TRAN INSERT Товар (Название, остаток) VALUES ('v',40) BEGIN TRAN INSERT Товар (Название, остаток) VALUES ('n',50) 182 BEGIN TRAN INSERT Товар (Название, остаток) VALUES ('m',60) ROLLBACK TRAN Здесь происходит возврат на начальное состояние таблицы, поскольку выполнение команды 183 11.6 Блокировки в среде MS SQL Server. Управление блокировками Пользователю чаще всего не нужно предпринимать никаких действий по управлению блокировками. Всю работу по установке, снятию и разрешению конфликтов выполняет специальный компонент сервера, называемый менеджером блокировок. MS SQL Server поддерживает различные уровни блокирования объектов (или детализацию блокировок), начиная с отдельной строки таблицы и заканчивая базой данных в целом. Менеджер блокировок автоматически оценивает, какое количество данных необходимо блокировать, и устанавливает соответствующий тип блокировки. Это позволяет поддерживать равновесие между производительностью работы системы блокирования и возможностью пользователей получать доступ к данным. Блокирование на уровне строки позволяет наиболее точно управлять таким доступом, поскольку блокируются только действительно изменяемые строки. Множество пользователей могут одновременно работать с данными с минимальными задержками. Платой за это является увеличение числа операций установки и снятия блокировок, а также большое количество служебной информации, которое приходится хранить для отслеживания установленных блокировок. При блокировке на уровне таблицы производительность системы блокирования резко увеличивается, так как необходимо установить лишь одну блокировку и снять ее только после завершения транзакции. Пользователь при этом имеет максимальную скорость доступа к данным. В то же время они не доступны никому другому, потому что вся таблица заблокирована. Приходится ожидать, пока текущий пользователь завершит работу. Действия, выполняемые пользователями при работе с данными, сводятся к операциям двух типов: их чтению и изменению. В операции по изменению включаются действия по добавлению, удалению и собственно изменению данных. В зависимости от выполняемых действий сервер накладывает определенный тип блокировки из следующего перечня: 184 Коллективные блокировки. Они накладываются при выполнении операций чтения данных (например, 185 блокировка диапазона ключей и блокировка схемы (метаданных, описывающих структуру объекта). Блокировка диапазона ключей решает проблему возникновения фантомов и обеспечивает требования сериализуемости транзакции. Блокировки этого типа устанавливаются на диапазон строк, соответствующих определенному логическому условию, с помощью которого осуществляется выборка данных из таблицы. Блокировка схемы используется при выполнении команд модификации структуры таблиц для обеспечения целостности данных. «Мертвые», или тупиковые, блокировки характерны для многопользовательских систем. «Мертвая» блокировка возникает, когда две транзакции блокируют два блока данных и для завершения любой из них нужен доступ к данным, заблокированным ранее другой транзакцией. Для завершения каждой транзакции необходимо дождаться, пока блокированная другой транзакцией часть данных будет разблокирована. Но это невозможно, так как вторая транзакция ожидает разблокирования ресурсов, используемых первой. Без применения специальных механизмов обнаружения и снятия «мертвых» блокировок нормальная работа транзакций будет нарушена. Если в системе установлен бесконечный период ожидания завершения транзакции (а это задано по умолчанию), то при возникновении «мертвой» блокировки для двух транзакций вполне возможно, что, ожидая освобождения заблокированных ресурсов, в тупике окажутся и новые транзакции. Чтобы избежать подобных проблем, в среде MS SQL Server реализован специальный механизм разрешения конфликтов тупикового блокирования. Для этих целей сервер снимает одну из блокировок, вызвавших конфликт, и откатывает инициализировавшую ее транзакцию. При выборе блокировки, которой необходимо пожертвовать, сервер исходит из соображений минимальной стоимости. Полностью избежать возникновения «мертвых» блокировок нельзя. Хотя сервер и имеет эффективные механизмы снятия таких блокировок, все же при 186 написании приложений следует учитывать вероятность их возникновения и предпринимать все возможные действия для предупреждения этого. «Мертвые» блокировки могут существенно снизить производительность, поскольку системе требуется достаточно много времени для их обнаружения, отката транзакции и повторного ее выполнения. Для минимизации возможности образования «мертвых» блокировок при разработке кода транзакции следует придерживаться следующих правил: − выполнять действия по обработке данных в постоянном порядке, чтобы не создавать условия для захвата одних и тех же данных; − избегать взаимодействия с пользователем в теле транзакции; − минимизировать длительность транзакции и выполнять ее по возможности в одном пакете; − применять как можно более низкий уровень изоляции. 11.7 Уровни изоляции MS SQL Server Уровень изоляции определяет степень независимости транзакций друг от друга. Наивысшим уровнем изоляции является сериализуемость, обеспечивающая полную независимость транзакций друг от друга. Каждый последующий уровень соответствует требованиям всех предыдущих и обеспечивает дополнительную защиту транзакций. MS SQL Server поддерживает все четыре уровня изоляции, определенные стандартом ANSI. Уровень изоляции устанавливается командой: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE } 187 READ UNCOMMITED – незавершенное чтение, или допустимо черновое чтение. Низший уровень изоляции, соответствующий уровню 0. Он гарантирует только физическую целостность данных: если несколько пользователей одновременно изменяют одну и ту же строку, то в окончательном варианте строка будет иметь значение, определенное пользователем, последним изменившим запись. По сути, для транзакции не устанавливается никакой блокировки, которая гарантировала бы целостность данных. Для установки этого уровня используется команда: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED READ COMMITTED – завершенное чтение, при котором отсутствует черновое, «грязное» чтение. Тем не менее, в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы. В итоге первая транзакция будет работать с другим набором данных. Это проблема неповторяемого чтения. Данный уровень изоляции установлен в MS SQL Server по умолчанию и устанавливается посредством команды: SET TRANSACTION ISOLATION LEVEL READ COMMITTED REPEATABLE READ – повторяющееся чтение. Повторное чтение строки возвратит первоначально считанные данные, несмотря на любые обновления, произведенные другими пользователями до завершения транзакции. Тем не менее, на этом уровне изоляции возможно возникновение фантомов. Его установка реализуется командой: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ SERIALIZABLE – сериализуемость. Чтение запрещено до завершения транзакции. Это максимальный уровень изоляции, который обеспечивает полную изоляцию транзакций друг от друга. Он устанавливается командой: SET TRANSACTION ISOLATION 188 LEVEL SERIALIZABLE В каждый момент времени возможен только один уровень изоляции. В общем случае результат выполнения транзакции не должен зависеть от других выполняющихся одновременно транзакций. Но полная изоляция транзакций делает невозможной параллельную обработку данных. В большинстве случаев такая строгость не нужна, и поэтому были введены так называемые «уровни изоляции» (Isolation Level), которые определяют степень параллелизма выполнения транзакций. Чем ниже уровень изоляции, тем выше степень параллелизма и тем больше риск «неправильного» выполнения транзакции. В стандарте ANSI SQL вводятся четыре уровня изоляции. И по названиям, и по поведению уровни изоляции в Microsoft SQL Server 2017 полностью соответствуют описанным в стандарте. В стандарте уровни изоляции описываются при помощи «феноменов» – побочных эффектов низкой изолированности транзакций. Всего их четыре: 1) грязная запись (Dirty Write); 2) грязное чтение (Dirty Read); 3) неповторяющееся чтение (Repeatable Read); 4) фантомы (Phantoms). Используются четыре уровня изоляции, которые устраняют вышеперечисленные феномены: 1. Read Uncommitted – самый низкий уровень изоляции. При этом уровне изоляции ликвидируется феномен «грязная запись», но транзакция может читать «грязные» данные незафиксированных транзакций. «Грязные» они потому, что если незафиксированная транзакция будет откачена, то получится, что были прочитаны никогда не существовавшие данные. 2. Read Committed – этот уровень изоляции решает проблему грязного чтения, т. е. в транзакции с таким уровнем изоляции невозможно прочитать данные незафиксированных транзакций, однако остается феномен 189 неповторяющегося чтения. Суть этого феномена в том, что если первая транзакция один раз прочитала данные, а потом вторая их изменила и зафиксировалась, то повторное чтение тех же данных первой транзакцией вернет уже измененные данные. Microsoft SQL Server использует этот уровень изоляции по умолчанию. 3. Repeatable Read – этот уровень решает предыдущую проблему, но при этом возможно появление фантомов. Изменение однажды прочитанных первой транзакцией данных другими транзакциями (до фиксации первой) невозможно, однако если первая транзакция сделала выборку по какому-то условию, а потом вторая транзакция добавила новые данные, этому условию удовлетворяющие, и зафиксировалась, то повторная выборка первой транзакцией по тому же условию вернет в том числе и добавленные данные – фантомы. 4. Serializable – при этом уровне изоляции никакие фантомы невозможны в принципе, равно как и другие феномены. Этот уровень изоляции ни на какие феномены не опирается, просто требуется, чтобы результат параллельного выполнения транзакций был таким же, как если бы они выполнялись последовательно. 11.8 Контрольное задание 1. Создайте таблицу в базе данных. create table SomeTable(x int, y int) go 2. Вставьте одну запись в таблицу. insert into SomeTable (x,y) values (1,1) 3. В одном окне 190 where y = 1 commit Выделить строки и запустить скрипт на выполнение (F5). 4. В другом окне 5. В первом окне выделите текст как на рисунке 1 и запустите скрипт на выполнение. Рисунок 1 – Запуск скрипта на выполнение Повторите запросы из пункта 4. Объясните полученные результаты. 191 6. Аналогично пунктам 3–5 продемонстрируйте проблемы при уровнях изоляции 7. Создайте вторую таблицу в базе данных. create table AnotherTable(x int, y int) go 8. Вставьте в обе таблицы по две записи. delete from SomeTable insert into SomeTable (x,y) values (1,1) insert into SomeTable (x,y) values (2,2) insert into AnotherTable (x,y) values (1,1) insert into AnotherTable (x,y) values (2,1) 9. В одном окне 192 where y = 2 commit 10. Во втором окне 11. В первом окне выделите строки 1–4 и запустить скрипт на выполнение, переключитесь на второе окно, выделите строки 1–4, запустите скрипт на выполнение. Переключитесь на первое окно, выделите оставшийся скрипт, выполните его. Переключитесь на второе окно, выделите оставшийся скрипт и выполните его. Объясните полученный результат. 11.9 Контрольные вопросы 1. Что понимается под управлением транзакциями? 2. Какие существуют команды, которые используются для управления транзакциями? 3. Какие существуют виды определения транзакций? 4. Для чего предназначены блокировки? 5. Какие существуют типы блокировок? 193 12 Лабораторная работа № 12. Разработка базы данных. В ms sql server Цель работы: научиться разрабатывать базу данных в MS SQL Server: создавать таблицы, схему данных, хранимые процедуры, триггеры, представления, индексы, назначать права доступа к данным. Используемое программное обеспечение: Microsoft SQL Server 2017. 12.1 Контрольное задание 1. Выполните контрольные задания в лабораторных работах № 4–10. 2. Создайте базу данных согласно выбранному вами варианту, содержащую: − не менее трех хранимых процедур; − не менее трех триггеров; − не менее трех представлений; − созданный составной индекс. 3. Продемонстрировать: − запросы, где осуществляется выборка и модификация данных из базы данных; − назначенные права доступа к данным. 12.2 Контрольные вопросы 1. Какие способы создания таблиц существуют в системе управления базами данных MS SQL Server? 2. Какие типы данных допустимы при создании таблицы? 3. Каким образом возможно проверить создание таблиц? 4. Каким образом осуществляется обеспечение целостности данных в MS SQL Server? 194 5. Как выполнить простейшие операции вставки строк данных в таблицу средствами T-SQL? 6. Как выполнить простейшие операции модификации строк таблицы средствами T-SQL? 7. Как выполнить просмотр таблицы? 8. Как сохранить результаты запроса в таблице? 9. Перечислите операторы управления. 10. Перечислите операторы манипулирования данными. 11. Что такое хранимая процедура? 12. Чем могут обладать хранимые процедуры? 13. Что такое триггер? 14. Каково назначение триггеров? 15. В чем отличие триггеров от хранимых процедур? 16. Сформулируйте определение представления. 17. Каково назначение представлений? 18. Что такое индекс? 19. Какие существуют типы индексов, в чем их отличия? 195 13 Лабораторная работа № 13. Разработка бизнес-правил Цель работы: научиться разрабатывать бизнес-правила. Используемое программное обеспечение: Microsoft SQL Server 2017. Определяя бизнес-правила, нужно выявить ограничения, на основе которых строится работа с системой и данными, а также меры их защиты. В систему бизнес-правил входят все ограничения, налагаемые на систему, в том числе целостность данных и безопасность системы. Организовать безопасность системы и целостность данных возможно несколькими способами: 1) настройка аутентификации и авторизации пользователя; 2) создание связей между таблицами и обеспечение целостности; 3) настройка управления правами доступа к данным; 4) создание триггеров на обеспечение целостности данных и управление транзакциями. Аутентификацию можно настроить, нажав правой кнопкой на локальный сервер в 13.1 Пример создания триггеров, запрещающего добавление, обновление и удаление строк в таблице. Триггер для запрета добавления строк в таблицу Рассмотрим создание триггера, который запрещает добавление строк в таблицу «Товар», выводя сообщение <Вставка строк запрещена>: create trigger товар_insert on Товар for Insert as 196 print 'Вставка строк запрещена' rollback tran При выполнении запроса в <MS Query Analizer> на вставку строк в таблицу «Товар», выводится сообщение <Вставка строк запрещена>. Если использовать для заполнения строк <MS Enterprise Manager>, сообщение выводиться не будет, но вставленные поля сохраняться не будут, так как в триггере прописана команда 13.2 Триггер для запрета обновления строк в таблице Рассмотрим создание триггера, который реагирует на модификацию существующих данных. При изменении поля <код_поставщика> в таблице «Поставщик» будет изменяться <код_поставщика> в таблице «Товар»: create trigger поставщик_updated on поставщик for update as IF UPDATE код_поставщика UPDATE товар SET код_поставщика = код_поставщика + inserted.код_поставщика – deleted.код_поставщика FROM товар, deleted, inserted WHERE товар.код_поставщика = inserted.код_поставщика AND товар.код_поставщика = deleted.код_поставщика 13.3 Триггера для запрета удаления строк из таблицы Рассмотрим создание триггера, который выполняет удаление полей из таблицы товар, если удалить соответствующие поля из таблицы поставщик: create trigger товар_delete 197 on товар for delete as select count(*) from товар, поставщик where товар.код_поставщика=поставщик.код_поставщика 13.4 Контрольное задание Разработать бизнес-правила к базе данных согласно выбранному вами варианту. 13.5 Контрольные вопросы 1. Что входит в систему бизнес-правил? 2. Какими способами можно организовать безопасность системы и целостность данных? 198 14 Лабораторная работа № 14. Разработка концептуальной модели приложения-клиента Цель работы: научиться разрабатывать концептуальную модель приложения-клиента. Используемое программное обеспечение: Ramus 2.0. Концептуальная модель приложения – это модель, которую проектировщик хочет довести до понимания пользователя. Используя приложение и читая документацию к нему, пользователь выстраивает в голове модель функционирования системы. Хорошо, если модель, возникшая в голове пользователя, и модель, задуманная проектировщиком, совпадают. Шансы на это выше, если проектировщик предварительно создаст четкую концептуальную модель. Концептуальная модель – это еще не пользовательский интерфейс. Она абстрактно – в терминах задач, нажатий на клавиши, манипуляций мышью или экранной графики – описывает, что именно пользователь должен делать с системой, и какие концепты ему необходимо знать. Основная идея заключается в том, что тщательная разработка подробной концептуальной модели, на основе которой потом проектируется пользовательский интерфейс, делает приложение более простым и понятным для понимания. При этом необходимо, во-первых, сделать концептуальную модель максимально простой с использованием минимального количества концептов для обеспечения необходимой функциональности; и, во-вторых, максимально ориентировать концептуальную модель на конкретные задачи, т. е. исключить или ограничить работу пользователя с концептами, не фигурирующими в данной области задач. Важным компонентом концептуальной модели является анализ объектов и действий – список всех видимых пользователю объектов приложения и действий, которые пользователь может совершать над каждым объектом. В реализации системы могут присутствовать и другие объекты, но предполагается, 199 что они будут невидимыми для пользователя. В частности, в состав концептуальной модели не могут входить чисто имплементационные объекты. Объекты концептуальной модели приложения могут образовывать структурную иерархию, в которой дочерние блоки будут перенимать действия родительских. В зависимости от приложения объекты могут также образовывать иерархию включения, в которой некоторые объекты включают в себя другие. Использование двух этих типов иерархии в концептуальной модели значительно облегчает проектирование и разработку связного и понятного пользовательского интерфейса. Подобный анализ объектов и действий помогает управлять реализацией системы, поскольку он указывает наиболее удобный вид иерархии объектов, а также методы работы, которые предусматривает каждый вид. Он также облегчает структуру команд приложения, т. к. позволяет разработчику увидеть, какие действия применимы к разным объектам и могут быть спроектированы как обобщенные. В свою очередь это делает структуру команд более легкой для изучения пользователем: вместо того, чтобы осваивать большое количество объектно-ориентированных команд достаточно изучить несколько обобщенных, применяемых к разным объектам. 14.1 Пример разрабатываемого приложения К примеру, если бы разрабатываемое приложение было программой, помогающей человеку управлять своим банковским счетом, концептуальная модель включала бы такие объекты, как проверки, счета, суммы денег и такие действия как размещение, отзыв, аннулирование, запрос баланса. Концептуальная модель должна исключать все объекты, не входящие в данную область задач (например, буферы, диалоговые окна, состояния, базы данных, строки), а также действия: нажатие клавиш, резервное копирование баз данных, очистка буфера обмена. 200 Поскольку компьютерная бухгалтерия иногда имеет свойства, не присущие бумажной, некоторые дополнительные функции могут попасть в концептуальную модель (например, такой объект как «шаблон операции» и такое действие как «определение шаблона»). Однако следует понимать, что каждый дополнительный концепт, добавленный в область задач, может создать две проблемы: 1) пользователи, знающие область задач, не распознают новый концепт, следовательно, его придется изучать дополнительно; 2) в геометрической прогрессии возрастет сложность приложения, поскольку каждый добавленный концепт начинает взаимодействовать с многочисленными другими концептами приложения. Вот почему следует строго ограничивать количество дополнительных концептов. Отсюда девиз разработчика пользовательского интерфейса: «Чем меньше, тем лучше». После разработки концептуальной модели необходимо написать сценарий, описывающий работу пользователя с приложением. При этом нужно использовать лишь терминологию из области задач. К примеру, в случае с банковским приложением следовало бы написать следующий сценарий: «Джон использует программу для проверки баланса своего текущего счета. Он кладет деньги на текущий счет, а потом переводит их с текущего счета на сберегательный». Следует отметить, что этот сценарий ссылается только на объекты и действия области задач, а не на свойства пользовательского интерфейса. В процессе разработки пользовательского интерфейса абстрактные концепты концептуальной модели переводятся в конкретные представления и действия пользователя. Для достижения оптимальных результатов пользовательский интерфейс проектируется после разработки концептуальной модели. Сценарии при этом могут быть переписаны на уровне пользовательского интерфейса. 201 Разработка концептуальной модели как первая стадия проектирования пользовательского интерфейса имеет ряд преимуществ. Разделение области задач на объекты и действия позволяет определить действия, одинаковые для нескольких объектов. Впоследствии один и тот же пользовательский интерфейс может быть использован для работы с разными объектами. Например, если в хорошо продуманном приложении пользователь может использовать объекты А и Б, и он хочет создать объект А, но умеет создавать только Б, он сумеет создать и А, поскольку это действие происходит единообразно для двух данных объектов. Как, впрочем, и копирование, перемещение, удаление, редактирование, печать и т. д. Это в свою очередь делает пользовательский интерфейс более простым и последовательным, а значит и более удобным в изучении и использовании. Даже если не брать в расчет упрощение, вызванное существованием обобщенных действий, при проектировании пользовательской модели разработчики должны признать относительную важность концептов, значимость концептов для области задач (в противоположность технической области), типовую иерархию и иерархию включения объектов. Все эти явления в значительной степени облегчают проектирование пользовательского интерфейса. Концептуальная модель представляет собой начальный этап разработки терминологии программного продукта, то есть словаря терминов, которые будут использоваться для идентификации каждого объекта и действия, реализованного в программе. Это способствует сохранению устойчивости терминологии не только в самой программе, но и в сопутствующей документации. Недостатками программы, разработанной без такой терминологии, являются: 1) использование многочисленных терминов для определения одного концепта; 2) использование одного термина для определения разных концептов. Наконец, разработка концептуальной модели представляет собой первоначальный вид объектной модели (по крайней мере, для объектов, 202 необходимых пользователю), которую разработчики могут в дальнейшем использовать при реализации программного обеспечения. Это особенно актуально если разработчик пишет программу на объектно-ориентированных языках, таких как Java, C# или С++. 14.2 Контрольное задание Разработать концептуальную модель приложения-клиента к базе данных согласно выбранному вами варианту. 14.3 Контрольные вопросы 1. Что такое концептуальная модель приложения клиента? 2. Привести пример концептуальной модели приложения клиента. 3. Преимущества разработки концептуальной модели. 203 15 Лабораторная работа № 15. Разработка приложения- клиента в среде Visual Studio 2017 на языке C# Цель работы: научиться разрабатывать клиентское приложение в среде Microsoft Visual Studio, используя платформу .NET: создавать меню; реализовывать отображение данных из таблиц базы данных, созданной в MS SQL Server; осуществлять поиск, сортировку, фильтрацию данных; реализовывать выполнение запросов и хранимых процедур. Используемое программное обеспечение: Microsoft SQL Server 2017, Microsoft Visual Studio 2017 Enterprise. 15.1 Настройка подключения к базе данных Для разработки приложения-клиента в среде программирования Microsoft Visual Studio используется технология ADO.NET. Установка соединения с хранилищем данных выполняется двумя путями: с помощью свойства Для подключения к базе данных необходимо запустить среду Visual Studio и выбрать пункт меню <Средства-Подключиться к базе данных> (рисунок 1). Откроется диалоговое окно (рисунок 2). 204 Рисунок 1 – Команда для открытия диалогового окна добавления подключения к существующей базе данных Рисунок 2 – Окно «Добавить подключение» 205 Для соединения с данными СУБД Microsoft SQL Server необходимо выбрать правильный драйвер для работы с базой данных, также называемый поставщиком данных: (рисунок 3). Рисунок 3 –Выбор поставщика данных При нажатии на кнопку <ОК> происходит возврат к окну добавления подключения Теперь необходимо указать имя сервера, имя пользователя и способ авторизации для защищенных баз данных, таких способа всего два: проверка подлинности Windows или проверка подлинности самого сервера, в первом случае, авторизацию на себя берет операционная система Windows и пароль указывать нужно в соответствии с настройками пользователя системы, во втором 206 случае, необходимо будет указать и отдельный пароль для подключения к серверу MS Server, последним выберите имя базы данных, введя его вручную или выбрав из всплывающего списка. Нажав кнопку (рисунок 4) или неудачи возникнет новое модельное окно с соответствующим сообщением. Основные параметры строки подключения к MS SQL Server БД: − Data Source – указывает имя экземпляра SQL Server, к которому нужно подключиться − Initial Catalog – параметр, указывающий на имя базы данных на сервере, к которой нужно подключиться − Integrated Security – позволяет использовать для подключения к серверу данные учетной записи Windows или имя входа SQL Server. − User Id – позволяет указать имя входа SQL Server для подключения к серверу − Password – пароль имени входа SQL Server Рисунок 4 – Всплывающее модальное окно с сообщением о результате успешной проверки Нажав кнопку – чтение и запись; 207 Deny Read> – запрещено открытие для чтения; «грязного чтения». В случае использования компонента Open. В случае использования любого из компонентов доступа к данным ( Для обеспечения доступа к таблицам хранилищ данных по технологии ADO служит компонент После создания строки подключения можно создавать экземпляр SqlConnection: string conStr = @"Data Source = .\SQLEXPRESS; Initial Catalog = BookShopDB; Integrated Security = True"; SqlConnection connection = new SqlConnection(conStr); Предварительно необходимо подключить ссылку на библиотеку с данными SQL клиента: using System.Data.SqlClient; Для открытия соединения с сервером у объекта SqlConnection есть метод Open(), а для закрытия – метод Close(). 208 Строку подключения удобно хранить в конфигурационном файле, который легко отредактировать в случае необходимости, для этого необходимо воспользоваться объектом: var setting = new ConnectionStringSettings{ Name = "MyConnectionString1", //имя строки подключения в конфигурационном файле ConnectionString = @"Data Source=.\SQLEXPRESS; Initial Catalog=BookShopDB; Integrated Security=True;"}; Configuration config; // Объект Config представляет конфигурационный файл config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // Объект ConfigurationManager предоставляет доступ к файлам конфигурации config.ConnectionStrings.ConnectionStrings.Add(setting); config.Save(); После установления связи компонента Для осуществления транзакций над данными (добавления, удаления, изменения и др.) используется компонент Управление записями, выведенными в поле просмотра, осуществляется с помощью навигатора < BindingNavigator >, который состоит из следующих кнопок (соответственно слева направо) (рисунок 5): 209 Рисунок 5 – Компонент BindingNavigator 1. Переход к первой записи. 2. Переход к предыдущей записи. 3. Переход к следующей записи. 4. Переход к последней записи. 5. Добавить запись. 6. Удалить запись. А также еще 4-х кнопок, требующих дополнительных настроек: 7. Изменить запись. 8. Сохранить изменения. 9. Не сохранять изменения. 10. Обновить. 15.2 Создание базы данных Рассмотрим создание приложения-клиента в среде программирования Visual Studio к базе данных интернет-магазина по продаже книг «BookShopDB». 1. Создайте базу данных интернет-магазина по продаже книг «Deliveries», «PublishHouse», «Orders», «OrderIremList», «AuthorList», «Clients»): Таблица 1 – Books Название поля Тип поля Описание поля BookID int Код закупаемой книги TitleBookName nvarchar Название книги Pages int Количество страниц AuthorListID int Код списка авторов PublishID int Код издательства Price money Цена за книгу 210 screen image Изображение книги screen_format varchar Поле для хранения типа формата изображения Таблица 2 – Authors Название поля Тип поля Описание поля AuthorID int Код автора FirstName nvarchar Имя автора MiddleName nvarchar Отчество автора LastName nvarchar Фамилия автора BirthDate date Дата рождения автора Таблица 3 – Deliveries Название поля Тип поля Описание поля DeliveriesID int Код поставщика DeliveriesFirstName nvarchar Имя ответственного лица DeliveriesMiddleName nvarchar Отчество ответственного лица DeliveriesLastName nvarchar Фамилия ответственного лица DeliveriesCompanyName nvarchar Название компании-поставщика AddressToDeliveries nvarchar Юридический адрес PhoneNumber char Контактный телефон INN char ИНН Таблица 4 – PublishHouse Название поля Тип поля Описание поля PublishID int Код издательства TitlePublishName nvarchar Название издательства TitleCityName nvarchar Город издательства Таблица 5 – Orders Название поля Тип поля Описание поля OrderID int Код заказа ClientID int Код клиента OrderItemListID int Код списка заказанных книг (из одного заказа) OrderDate datetime Дата и время заказа TotalPrice money Итоговая сумма заказа Amount int Количество книг в заказе DeliveriesID int Код поставщика Таблица 6 – OrderIremList Название поля Тип поля Описание поля ItemListID int Код списка заказанных книг (из одного заказа) AmountOfItems int Количество книг в заказе OrderID int Код заказа 211 Таблица 7 – AuthorList Название поля Тип поля Описание поля AuthorListID int Код списка авторов AuthorID int Код автора Таблица 8 – Clients Название поля Тип поля Описание поля ClientID int Код клиента ClientFirstName nvarchar Имя клиента ClientMiddleName nvarchar Отчество клиента ClientLastName nvarchar Фамилия клиента ClientBirthDate date Дата рождения клиента ClientPhoneNumber char Номер телефона клиента ClientEmail nvarchar Электронная почта клиента ClientAddress nvarchar Почтовый адрес клиента 2. Свяжите их согласно представленной диаграмме (рисунок 6): Рисунок 6 – Диаграмма базы данных книжного магазин 212 3. Заполните поля в таблицах данными. 4. Создайте хранимую процедуру для определения количества заказов, совершенных за указанный период: CREATE PROC spCountOfOrders @d1 DATETIME, @d2 DATETIME, @c INT OUTPUT AS SELECT @c=count(OrderID) from Orders WHERE OrderDate BETWEEN @d1 AND @d2 SET @c=ISNULL(@c,0) 5. Создайте хранимую процедуру для определения списка заказанных книг для определенного заказа: CREATE PROC ListOrdersSelectCommand (@OrderID int) AS SET NOCOUNT ON; select bk.BookID, bk.TitleBookName, bk.Price from Orders as ord join OrderItemList as orl on ord.OrderItemListID = orl.OrderID and ord.OrderID = @OrderID join Books as bk on bk.BookID = orl.ItemListID 6. Создайте хранимую процедуру для определения списка всех авторов одной книги: CREATE PROC [dbo].[spBookAuthorsList] @ListID int OUTPUT AS begin select distinct al.AuthorID, TitleBookName as bookname, left(ars.FirstName,1) + '. ' + left(ars.MiddleName,1) + '. '+ars.LastName as Authors from books bk join AuthorList al on bk.AuthorListID = al.AuthorListID and al.AuthorListID = @ListID join Authors ars on ars.AuthorID = al.AuthorID end 7. Создайте хранимую процедуру для объединения ФИО автора книги книги: CREATE PROC spListAllAuthors AS select Authors.AuthorID, left(Authors.FirstName,1) + '. ' + left(Authors.MiddleName,1) + '. ' + Authors.LastName as AuthorName from Authors 8. Создайте хранимую процедуру для определения списка книг в конкретном заказе: PROC spListOfOrders @ParamOrderID int OUTPUT AS begin select bk.BookID, bk.TitleBookName, bk.Price, orl.AmountOfItems from Orders as ord join OrderItemList as orl on ord.OrderItemListID = orl.OrderID and ord.OrderID = @ParamOrderID join Books as bk on bk.BookID = orl.ItemListID end 213 15.3 Создание клиентского приложения При создании клиентского приложения будем использовать встроенные инструменты для работы с данными. Создадим приложение типа Windows Forms (.NET Framework) и назовем его BookShopDB, для этого выберем в главном меню Visual Studio пункт создания нового проекта (рисунок 7). Рисунок 7 – Создание проекта 214 15.4 Добавление компонентов на форму Используя окно панели элементов, добавьте на форму ( − − − − (вкладка контейнеры) на который установить (вкладка <Данные>) и − 3 компонента − 7 компонентов − 5 компонентов − − 4 компонента 215 У компонента 15.5 Выбор источника данных У компонента Рисунок 9 – Выбор источника данных В появившемся диалоговом окне выберите пункт «База данных» и нажмите кнопку «Далее» (рисунок 10), в следующем окне выберите «Набор данных», снова нажмите кнопку «Далее» (рисунок 11). Затем выберите подключение из созданного ранее или создайте новое (рисунок 12), нажмите кнопку «Далее». В следующем окне выберите имя строки подключения, затем нажмите кнопку 216 «Далее» (рисунок 13). В появившемся окне, выберите объекты из базы данных, которые нужно подключить в качестве источника данных (рисунок 14) и задайте имя источника данных, затем нажмите кнопку «Готово». Рисунок 10 – Выбор типа источника данных Рисунок 11 – Выбор модели базы данных 217 Рисунок 12 – Выбор подключения к базе данных Рисунок 13 – Сохранение подключения в конфигурационном файле 218 Рисунок 14 – Выбор объектов базы данных 15.5 Добавление меню и первичная настройка элементов главной формы Добавьте меню для приложения как на рисунке 15: Рисунок 15 – Создание меню − В меню <Справка> создайте подменю <Помощь> и <О программе>. 219 − У компонента − У компонента − У компонентов «Тип сортировки». − У компонентов − У компонента «Сортировка». − У компонента Выровняйте компоненты. Добавьте еще одну кнопку, измените ее свойство Рисунок 16 – Главная форма клиентского приложения 220 15.6 Создание остальных форм приложения Далее создайте новые формы для представлений авторов, клиентов, добавления даты, поставщиков, книг, издательства, оформления и представления заказов. Для создания новой формы перейдите в окно обозревателя решений, выделите свой проект правой клавишей мыши и выберите пункт добавления новой формы (рисунок 17). Рисунок 17 – Добавление новой формы Добавьте новые формы FrmAuthors, FrmClients, FrmDate, FrmDeliveries, FrmEditBooks, FrmPublishHouse, FrmPurchases, FrmViewOrdersInfo (рисунки 18 - 26). 221 Рисунок 18 – Форма «Авторы» Рисунок 19 – Форма «Клиенты» 222 Рисунок 20 – Форма «Добавление даты» Рисунок 21 – Форма «Поставщики» 223 Рисунок 22 – Форма «Книги» (добавление или редактирование) Рисунок 23 – Форма «Издательства» 224 Рисунок 24 – Форма «Оформление заказа» Рисунок 25 – Форма «Информация о заказах» 225 15.7 Настройка объекта «DataSet» В обозревателе решений найдите и кликните дважды, созданный ранее Рисунок 26 – Выбор Добавьте все созданные элементы из базы данных, для этого нажмите правой клавишей мыши в конструкторе диаграмм и выберите пункт «Добавить- TableAdapter» (рисунок 27). Рисунок 27 – Добавление нового После добавления всех объектов окно конструктора должно принять такой вид (содержать следующие объекты таблиц и процедур из базы данных) как на рисунке 28. 226 Рисунок 28 – Окно конструктора со схемой таблиц Обратите внимание, что на схему автоматически добавились также и отношения между таблицами. Выберите пункт «Сохранить все» в основном меню Visual Studio, после этого будут автоматически сгенерированы объекты для взаимодействия с данными из 15.8 Настройка элементов главной формы «FrmMain» Далее перейдите на главную форму − найдите свойство – это заголовок окна; − найдите свойство − найдите свойство − у свойства 227 − у свойства − у свойства − проделайте соответствующие операции для всех остальных форм. 15.9 Добавление обработчика события «Form_Load» для главной формы Откройте главную форму «События», найдите событие Form1_Load( object sender, EventArgs e) { this .Height = 510; this .dataTable1TableAdapter.Fill( this .dataSet1.DataTable1); this .booksTableAdapter.Fill( this .dataSet1.Books); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; toolTip1 = new ToolTip(); LoadAuthorsFromProcToTheList(); this .dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; } 228 Рисунок 29 – Обработчики событий формы 15.10 Настройка объекта «dataGtidView1» Для объекта − DataSource и установите связь с соответствующей таблицей из созданного выше Рисунок 30 – Добавление источника данных 229 После этого будут сгенерированы экземпляры специальных объектов типа − Щелкните по |