Основные принципы методологии SADT

Основные принципы методологии SADT:

Четкое описание цели моделирования;

Фиксация единой точки зрения на моделируемую систему;

Определение границ системы;

Декомпозиция, обеспечивающая последовательную детализацию описания;

Цель модели – получение ответов на некоторую совокупность вопросов;

Точка зрения – это позиция наблюдателя, которую необходимо выбрать, чтобы увидеть систему в действие;

У модели может быть только одна точка зрения!!!

SADTмодель должна иметь единственный субъект;

В SADT-моделях используются как естественный, так и графический языки;

Диаграмма – совокупность графического и соответствующего текстового описания

SADT (Structured Analysis and Design Technique)

Методология структурного анализа и проектирования, интегрирующая процесс моделирования, управление конфигурацией проекта, использование дополнительных языковых средств и руководство проектом со своим графическим языком. Процесс моделирования может быть разделен на несколько этапов: опрос экспертов, создание диаграмм и моделей, распространение документации, оценка адекватности моделей и принятие их для дальнейшего использования. Этот процесс хорошо отлажен, потому что при разработке проекта специалисты выполняют конкретные обязанности, а библиотекарь обеспечивает своевременный обмен информацией. Признание полезности SADT привело к стандартизации и публикации ее части, предназначенной для функционального моделирования, как методологии и стандарта функционального моделирования и описания бизнес-процессов IDEF0.

DFD (Data Flow Diagrams)

Диаграммы потоков данных. Описывают внешние по отношению к системе источники и адресаты данных, логические функции, потоки данных и хранилища данных к которым осуществляется доступ. Как показывает практика, это один из самых простых, доступных и наглядных стандартов для описания бизнес-процессов.

Модель "сущность-связь" основывается на некой важной семантической информации о реальном мире и предназначена для логического представления данных. Она определяет значения данных в контексте их взаимосвязи с другими данными. Важным для нас является тот факт, что из модели "сущность-связь" могут быть порождены все существующиемодели данных (иерархическая, сетевая, реляционная, объектная), поэтому она является наиболее общей.

Нормализация - это формальный метод анализа отношений на основе их первичного ключа и существующих связей. Ее задача - это замена одной схемы (или совокупности отношений ) БД другой схемой, в которой отношения имеют более простую и регулярную структуру.

При работе с реляционной моделью для создания отношений приемлемого качества достаточно выполнения требований первой нормальной формы.

Первая нормальная форма (1НФ) связана с понятиями простого и сложного атрибутов. Простой атрибут - это атрибут, значения которого атомарны (т.е. неделимы). Сложный атрибут может иметь значение, представляющее собой объединение нескольких значений одного или разных доменов. В первой нормальной форме устраняются повторяющиеся атрибуты или группыатрибутов, т.е. производится выявление неявных сущностей, "замаскированных" под атрибуты.

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

Для приведения таблиц к 1НФ необходимо разбить сложные атрибуты на простые, а многозначные атрибуты  вынести в отдельные отношения.

Вторая нормальная форма (2НФ) применяется к отношениям с составными ключами (состоящими из двух и более атрибутов ) и связана с понятиями функциональной зависимости.

Если в любой момент времени каждому значению атрибута A соответствует единственное значение атрибута B, то B функционально зависит от A (A  B). Атрибут (группа атрибутов ) A называется детерминантом.

Во второй нормальной форме устраняются атрибуты, зависящие только от части уникального ключа. Эта часть уникального ключа определяет отдельную сущность.

Отношение находится во 2НФ, если оно приведено к 1НФ и каждый неключевой атрибут функционально полно зависит от составного первичного ключа.

Третья нормальная форма (3НФ) связана с понятием транзитивной зависимости. Пусть A, B, C - атрибуты некоторогоотношения. При этом A  B и B  C, но обратное соответствие отсутствует, т.е. C не зависит от B или B не зависит от A. Тогда говорят, что C транзитивно зависит от A (A   C).

В третьей нормальной форме устраняются атрибуты, которые зависят от атрибутов, не входящих в уникальный ключ. Этиатрибуты являются основой отдельной сущности.

Отношение находится в 3НФ, если оно находится во 2НФ и не имеет атрибутов, не входящих в первичный ключ и находящихся в транзитивной зависимости от первичного ключа.

Объектно-ориентированная парадигма.

Объектно-ориентированное программирование (ООП) – это результат естественной эволюции более ранних методологий программирования. Результатом объектной декомпозиции является совокупность объектов, которые затем реализуют как переменные некоторых специально разрабатываемых типов (классов), представляющих собой совокупность полей данных и методов, работающих с этими полями. Можно сказать, чтоООП – это моделирование объектов посредством иерархически связанных классов. При этом малозначащие детали объекта скрыты от нас, и если мы даем команду какому-то объекту, то он «знает», как ее выполнить. Фундаментальной концепцией в ООП является понятие обязанности илиответственности за выполнение действия.

Все объекты являются представителями, или экземплярами, классов. Метод, активизируемый объектом в ответ на сообщение, определяется классом, к которому принадлежит получатель сообщения. Все объекты одного класса используют одни и те же методы в ответ на одинаковые сообщения. Классы представляются в виде иерархической древовидной структуры, в которой классы с более общими чертами располагаются в корне дерева, а специализированные классы и, в конечном итоге, индивидуумы располагаются в ветвях. Уже в самой объектной декомпозиции содержатся элементы рекурсивных построений, поскольку полученная таким образом иерархия объектов обладает элементами самоподобия. Как известно, в основе объектно-ориентированного программирования лежат три основных понятия: инкапсуляция (сокрытие данных в классе или методе); наследование; полиморфизм. Инкапсуляцию можно представить, как защитную оболочку вокруг кода данных, с которыми этот код работает. Оболочка задает поведение и защищает код от произвольного доступа извне. Наследование – это процесс, в результате которого один тип наследует свойства другого типа. Полиморфизм – это концепция, позволяющая иметь различные реализации для одного и того же метода, которые будут выбираться в зависимости от типа объекта, переданного методу при вызове.

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

Рекурсия в данной парадигме реализуется как в процессе объектной декомпозиции так и прямым образом. В общем случае разработка объектно-ориентированных программ на несколько порядков сложнее, чем традиционных, но построение рекурсивной иерархии объектов является не только вполне посильной, но и жизненно необходимой задачей для школьников.

 

Значение языка UML предназначен для моделирования. Сами авторы UML определяют свое детище следующим образом.

Язык UML ‒ это графический язык моделирования общего назначения, предназначенный для спецификации, визуализации, проектирования и документирования всех артефактов, создаваемых при разработке программных систем.

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

Диаграмма прецедентов (use case diagram)

Любые (в том числе и программные) системы проектируются с учетом того, что в процессе своей работы они будут использоваться людьми и/или взаимодействовать с другими системами. Сущности, с которыми взаимодействует система в процессе своей работы, называются экторами, причем каждый эктор ожидает, что система будет вести себя строго определенным, предсказуемым образом. Попробуем дать более строгое определение эктора. Для этого воспользуемся замечательным визуальным словарем по UML Zicom Mentor:

Эктор (actor) - это множество логически связанных ролей, исполняемых при взаимодействии с прецедентами или сущностями (система, подсистема или класс). Эктором может быть человек или другая система, подсистема или класс, которые представляют нечто вне сущности.

Графически эктор изображается либо " человечком ", подобным тем, которые мы рисовали в детстве, изображая членов своей семьи, либо символом класса с соответствующим стереотипом, как показано на рисунке. Обе формы представления имеют один и тот же смысл и могут использоваться в диаграммах. "Стереотипированная" форма чаще применяется для представления системных экторов или в случаях, когда эктор имеет свойства и их нужно отобразить (рис. 2.1).

Внимательный читатель сразу же может задать вопрос: а почему эктор, а не актер? Согласны, слово "эктор" немного режет слух русского человека. Причина же, почему мы говорим именно так, проста - эктор образовано от слова action, что в переводе означает действие. Дословный же перевод слова "эктор" - действующее лицо - слишком длинный и неудобный для употребления. Поэтому мы будем и далее говорить именно так.

Рис. 2.1.

Тот же внимательный читатель мог заметить промелькнувшее в определении эктора слово "прецедент". Что же это такое? Этот вопрос заинтересует нас еще больше, если вспомнить, что сейчас мы говорим о диаграмме прецедентов. Итак,

Прецедент (use-case) - описание отдельного аспекта поведения системы с точки зрения пользователя (Буч).

Определение вполне понятное и исчерпывающее, но его можно еще немного уточнить, воспользовавшись тем же Zicom Mentor'ом:

Прецедент (use case) - описание множества последовательных событий (включая варианты), выполняемых системой, которые приводят к наблюдаемому эктором результату. Прецедент представляет поведение сущности, описывая взаимодействие между экторами и системой. Прецедент не показывает, "как" достигается некоторый результат, а только "что" именно выполняется.

Прецеденты обозначаются очень простым образом - в виде эллипса, внутри которого указано его название. Прецеденты и экторы соединяются с помощью линий. Часто на одном из концов линии изображают стрелку, причем направлена она к тому, у кого запрашивают сервис, другими словами, чьими услугами пользуются. Это простое объяснение иллюстрирует понимание прецедентов как сервисов, пропагандируемое компанией IBM.

Отношения в модели Use Case. Особенности их использования

Ассоциация (association) является одним из фундаментальных понятий в языке UML 2.х и может использоваться на различных канонических диаграммах при построении визуальных моделей

Применительно к диаграммам вариантов использования отношение ассоциации может служить только для обозначения взаимодействия актера с вариантом использования.

Отношение зависимости (dependency) определяется как форма взаимосвязи между двумя элементами модели, предназначенная для спецификации того обстоятельства, что изменение одного элемента модели приводит к изменению некоторого другого элемента

Отношение включения (include) специфицирует тот факт, что некоторый вариант использования содержит поведение, определенное в другом варианте использования

Отношение расширения (extend) определяет взаимосвязь одного варианта использования с некоторым другим вариантом использования, функциональность или поведение которого задействуется первым не всегда, а только при выполнении некоторых дополнительных условий.

ADO.NET – основные концепции

ADO.NET – это следующий шаг в эволюции универсальных механизмов доступа к данным, ориентированный на поддержку распределенных приложений, в том числе использующих мобильные устройства в качестве клиентских рабочих мест. Типичная модель подобного приложения основана на применении кэшируемых наборов данных, представляющих собой хранящуюся в оперативной памяти базу данных, содержащую таблицы, связи между ними, индексы, ограничения, и т.п. В ADO.NET (по сравнению с ADO) поддержка подобных наборов данных существенно расширена.

Одним из ключевых, по сравнению с ADO, изменений является отсутствие класса Recordset, на смену которому пришла комбинация классов DataTable, DataSet, DataAdapter и DataReader. Класс DataTable представляет собой коллекцию строк из одной таблицы, и с этой точки зрения он схож с классом Recordset. Класс DataSet представляет собой коллекцию объектов типа DataTable, вместе со связями между ними и ограничениями, что позволяет связывать вместе несколько таблиц. В целом, DataSet – это содержащаяся в памяти реляционная структура со встроенной поддержкой языка XML. Встроенная поддержка языка XML означает, что данные DataSet могут быть выгружены/загружены в XML с сохранением всех связей и ограничений.

Одной из наиболее важных характеристик класса DataSet является то, что он ничего не знает об источнике данных, который использовался для его заполнения. С этой точки зрения DataSet – это отсоединенное представление данных, которое может передаваться от компонента к компоненту через различные звенья многозвенного приложения. DataSet можно превратить в поток XML-данных и использовать его для передачи данных между гетерогенными платформами.

Класс DataAdapter используется в ADO.NET для передачи данных между DataSet и источником данных. Класс DataAdapter также поддерживает расширенные возможности пакетного обновления данных, которые ранее были реализованы в классе Recordset.

Ниже мы рассмотрим пространства имен и классы, реализующие функциональность ADO.NET, а также некоторые примеры их применения.

Режимы доступа к данным с помощью ADO.NET: назначение, компоненты, особенности.

Поставщики данных .NET

Подключаемая часть ADO.Net представляет собой набор объектов подключений.

Объекты подключений разделяются в ADO.NET по конкретным реализациям для различных СУБД. То есть для подключения к базе данных SQL SERVER имеется специальных класс SqlConnection.

Эти отдельные реализации для конкретных СУБД называются поставщиками данных .NET

При наличии широкого выбора доступных источников данных ADO.NET должна иметь возможность поддерживать множество источников данных. Каждый такой источник данных может иметь свои особенности или набор возможностей.

Поэтому ADO.NET поддерживает модель поставщиков. Поставщики для конкретного источника данных можно определить как совокупность классов в одном пространстве имен созданных специально для данного источника данных. Эта особенность несколько размыта для источников данных OleDb, ODBC, так как они по своей сути созданы для работы с любой базой данных совместимых с OLE и ODBC.

Подключаемые классы и объекты.

В подключаемой части ADO.NET имеются следующие основные классы:

Connection. Этот класс, позволяющий устанавливать подключение к источнику данных. ( OleDbConnection, SqlConnection, OracleConnection)

Transaction. Объект транзакций (OleDbTransaction, SqlTransaction, OracleTransaction. В ADO.NET имеется пространство имен System.Transaction)

DataAdapter. Это своеобразный шлюз между автономными и подключенными аспектами ADO.NET. Он устанавливает подключение, и если подключение уже установлено, содержит достаточно информации, чтобы воспринимать данные автономных объектов и взаимодействовать с базой данных. (DataAdapter - SqlDataAdapter, OracleDataAdapter)

Command. Это класс представляющий исполняемую команду в базовом источнике данных.

Parameter. Объект параметр команды.

DataReader. Это эквивалент конвейерного курсора с возможностью только чтения данных в прямом направлении.

Рассмотрим режим активного подключения или связного уровня доступа.

При использовании связного уровня доступа программный код непосредственно соединяется с хранилищем данных. Выполняются необходимые действия по обработке данных и соединение разрывается. Если из источника должны поступать данные в приложение, то необходимо организовать чтение данных и размещение их в элементах управления формы (рис.2).

19) Рассмотрим режим отсоединенного подключения или связный уровень доступа.

При использовании отсоединенного подключения необходимо использовать объект DataSet для организации локального хранения данных в приложении. Для заполнения DataSet используется объект DataAdapter. Отображение данных в элементах формы в этом случае выполняется проще, так как данные хранятся в контейнере DataSet (рис.3).

20) Провайдеры данных

http://www.cnshb.ru:210/ZooPARK/Part_9.htm

21) Объект Connection служит для установления соединения с заданным источником данных. Соединение можно настроить, редактируя нужным образом значения параметров строки подключения - свойство ConnectionString.

Для подключения к базе данных необходимо использовать свойство ConnectionString и метод Open(). В следующем примере показана типичная строка подключения.

SqlConnection cnn = new SqlConnection (@"Persist Security Info=False; Integrated Security=true; Initial Catalog=Dogovor; server=(local)");

Объект Connection имеет методы Open() и Close(), которые открывают/закрывают подключение к базе данных со значениями свойств, определяемыми объектом ConnectionString.

Объект Connection имеет набор свойств, например, ServerVersion, State, которые отображают состояние объекта во время последней сетевой операции, выполненной при подключении. Пример использования свойств объекта Connection показан ниже:

22) Метод ExecuteReader() применяется для возвращения набора записей. В большинстве приложений для работы с базами данных именно этот метод используется чаще всего. Работа метода основана на объекте DataReader, с помощью которого записи обрабатываются последовательно одна за другой.

Объект DataReader предназначен для чтения в прямом направлении небуферизуемого потока записей, полученных от метода ExecuteReader() объекта Command.

Объект DataReader предлагает наиболее быстрый способ доступа к источнику данных, но не предусматривает возможности прокрутки и обновления данных. Для перехода к следующей записи объекта DataReader нужно вызвать его метод Read().

Доступ к полям каждой записи данных объекта DataReader можно выполнять следующими способами:

по индексу поля в таблице: MyReader[1];

или по имени поля: MyReader[“Name_Column”].

23) DataAdapter играет роль связующего звена между двумя компонентами ADO.NET: подключенным к источнику данных компонентом провайдеров данных .NET и неподключенным к источнику данных компонентом объектов DataSet. Основным назначением объекта DataAdapter является управление процессом передачи данных от источника данных к объекту DataSet и от объекта DataSet к источнику данных.

Метод Fill() наполняет объект DataAdapter данными, полученными от источника данных, а метод Update() обновляет источник данных в соответствии с изменениями данных в таблицах объекта DataSet.

Данные в объекте DataSet организованы в одной или нескольких объектах DataTable. Объекты DataTable содержит коллекции объектов DataRow, DataColumn и Constraint, а также коллекции объектов DataRelation, связанные с другими родительскими и дочерними объектами.

24) Теперь рассмотрим применение объекта Command с хранимыми процедурами.

При создании запросов или команд часто требуется передавать значения параметров. Для решения этой проблемы в объекте Command предусмотрено свойство Parameters, которое является объектом ParameterCollection и содержит коллекцию объектов-параметров Parameter.

Аналогично вызываются на исполнение хранимые процедуры, за исключением того, что вместо свойства CommandType.Text используется свойство CommandType.StoredProcedure, а имя хранимой процедуры присваивается свойству CommandText25) Управление взаимодействием с существующими источниками данных осуществляется с помощью DataAdapter.

Свойство SelectCommand объекта DataAdapter представляет собой объект Command, получающий данные из источника данных. Свойства InsertCommand, UpdateCommand и DeleteCommand, принадлежащие DataAdapter, являются объектами Command, которые управляют обновлением данных в источнике данных в соответствии с изменениями данных в DataSet.

Метод Fill() объекта DataAdapter служит для заполнения набора данных DataSet результатами выполнения метода SelectCommand объекта DataAdapter. Метод Fill() принимает в качестве аргумента подлежащий заполнению набор данных DataSet, а также объект DataTable или имя объекта DataTable, который должен быть заполнен строками, возвращенными методом SelectCommand.

25) Теперь рассмотрим применение объекта Command с параметрами

При создании запросов или команд часто требуется передавать значения параметров. Для решения этой проблемы в объекте Command предусмотрено свойство Parameters, которое является объектом ParameterCollection и содержит коллекцию объектов-параметров Parameter.

26) Метод ExecuteReader() выполняет команду и возвращает типизированный объект-читатель данных, в зависимости от используемого поставщика

27)  методы   объекта   Command .

Метод ExecuteNonQuery применяется для выполнения запросов, не возвращающих данные, таких как UPDATE, INSERT и DELETE - они вносят изменения в таблицу базы данных, не возвращая ничего назад в результате выполнения.

Создадим новое консольное приложение. Ниже приведен его полный листинг:

using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; namespace ConsoleApplication3 {          class Program {             static void Main(string[] args) {                        string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename="+ @"D:\ВМИ\For ADO\BDTur_firmSQL2.mdf" + "integrated Security=True;Connect Timeout=30;User Instance=True"; string commandText = "SELECT * FROM Туры";                        SqlConnection conn = new SqlConnection(connectionString);                        conn.Open();                        SqlCommand myCommand = conn.CreateCommand();                        myCommand.CommandText = "UPDATE Туристы " + "SET Фамилия = 'Сергеева' WHERE [Код туриста] = 3";                        myCommand.ExecuteNonQuery();                        conn.Close();             }          } }

В свойстве CommandText указывается непосредственно текст запроса, который устанавливает значение «Сергеева» поля «Фамилия» для записи с полем «Код Туриста» = 3. Для выполнения запроса просто вызываем метод ExecuteNonQuery:

myCommand.ExecuteNonQuery();

Запускаем приложение, нажимая F5. При успешном выполнении запроса консольное окно приложения появляется и тут же исчезает. Запускаем Management Studio, открываем таблицу «Туристы» и убеждаемся в том, что запись изменилась (рис. 77).

Рис. 77. Таблица «Туристы», изменение записи

Метод ExecuteNonQuery неявно возвращает результат выполнения запроса в виде количества измененных записей. Это значение может применяться для проверки правильности выполнения запроса, например, следующим образом:

int UspeshnoeIzmenenie = myCommand.ExecuteNonQuery(); if (UspeshnoeIzmenenie !=0) {          Console.WriteLine ("Изменения внесены"); } else {          Console.WriteLine(“Не удалось внести изменения"); }

Отметим, что данный вариант текста не позволяет отличить обновление одной строки и нескольких строк.

Закомментируем имеющееся свойство CommandText и добавим новое:

myCommand.CommandText = "INSERT " +          "INTO Туристы ([Код туриста], Фамилия, Имя, Отчество) " +          "VALUES (6, 'Тихомиров', 'Андрей', 'Борисович')";

Запускаем приложение, затем переходим в SQL Server Enterprise Manager - запрос добавил новую запись (рис. 78).

Рис. 78. Таблица «Туристы», добавление записи

Снова закомментируем свойство CommandText, добавим теперь запрос на удаление записи:

myCommand.CommandText = "DELETE FROM Туристы WHERE [Код туриста] = 4";

Запускаем приложение - из таблицы удалена четвертая запись (рис. 79). Метод ExecuteNonQuery применяется также для выполнения запросов, относящихся к категории DDL языка SQL. Язык определения данных (Data Definition Language, DDL) позволяет создавать и изменять структуру объектов базы данных, например, создавать и удалять таблицы. Основными операторами этого языка являются CREATE, ALTER, DROP. В результате выполнения запросов DDL не возвращаются данные - именно поэтому можно применять метод ExecuteNonQuery.

Рис. 79. Таблица «Туристы», удаление записи

Закомментируем имеющееся свойство CommandText и напишем новое, создающее в базе BDTur_firm2 новую таблицу «Отзывы»:

myCommand.CommandText = "CREATE TABLE Отзывы (Кодотзыва INT NOT NULL, " +                       "Кодтуриста INT NOT NULL, Комментарий VARCHAR(50))";

Запускаем приложение, затем переходим в Management Studio, нажимаем кнопку обновить на панели инструментов - в базе появляется новая таблица (рис. 80).

Рис. 80. Свойства таблицы "Отзывы"

Для добавления нового столбца «Отзыв туриста» строка CommandText должна иметь следующий вид:

myCommand.CommandText = "ALTER TABLE Отзывы ADD Отзывтуриста VARCHAR(50)";

В Management Studio в списке столбцов таблицы видим новое поле «Отзывтуриста» (рис. 81).

Рис. 81. База данных BDTur_firm2, новая таблица "Отзывы"

Для удаления таблицы «Отзывы» запускаем приложение, содержащее следующую строку CommandText:

myCommand.CommandText = "DROP TABLE Отзывы";

В Management Studio видно, что таблица полностью исчезла из базы данных. Если нужно лишь удалить данные из таблицы, сохранив структуру, то необходимо воспользоваться следующей командой:

myCommand.CommandText = "DELETE FROM Отзывы";

Объектами базы данных могут быть не только таблицы, но и хранимые процедуры, схемы, представления. В любом случае манипуляция с ними будет относиться к категории DDL.

Метод ExecuteNonQuery может применяться и для выполнения запросов, относящихся к категории DCL. Язык управления данными (Data Control Language, DCL) предназначен для управления доступом (определения полномочий) к объектам базы данных. Основными операторами этого языка являются GRANT, DENY, REVOKE. Данные запросы рассматриваться не будут - использование в данном случае объекта Commnad не отличается ничем от рассмотренного выше.

 

Метод ExecuteScalar

 

 Метод  ExecuteScalar  объекта   Command  применяется для запросов, возвращающих одно значение. Такие запросы возникают при использовании агрегатных функций COUNT, MIN, MAX. Для демонстрации метода создадим новое консольное приложение. Полный листинг этого приложения:

using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; namespace ConsoleApplication3 {           class Program {           static void Main(string[] args) {             string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename="+                        @"D:\ВМИ\For ADO\BDTur_firmSQL2.mdf"+                        "integrated Security=True;Connect Timeout=30;User Instance=True";             string commandText = "SELECT * FROM Туры";             SqlConnection conn = new SqlConnection(connectionString);             conn.Open();             SqlCommand myCommand = conn.CreateCommand();             myCommand.CommandText = "SELECT COUNT (*) FROM Туры";             string KolichestvoTurov = Convert.ToString(myCommand.ExecuteScalar());             conn.Close();             Console.WriteLine("Количество туров: " + KolichestvoTurov);             Console.ReadKey();           }           } }

Возвращаемый методом ExecuteScalar результат приводим к типу string для вывода в окно консоли. Запускаем приложение - запрос вернул число 5 (рис. 82).

Рис. 82. Вывод количества туров

Можно несколько раз применять этот метод.

myCommand.CommandText = "SELECT COUNT (*) FROM Туры"; string KolichestvoTurov = Convert.ToString(myCommand.ExecuteScalar()); myCommand.CommandText = "SELECT MAX (Цена) FROM Туры"; string MaxPrice = Convert.ToString(myCommand.ExecuteScalar()); myCommand.CommandText = "SELECT MIN (Цена) FROM Туры"; string MinPrice = Convert.ToString(myCommand.ExecuteScalar()); myCommand.CommandText = "SELECT AVG (Цена) FROM Туры"; string AvgPrice = Convert.ToString(myCommand.ExecuteScalar()); conn.Close(); Console.WriteLine("Количество туров: " + KolichestvoTurov +                 “\nСамый дорогой тур, цена в руб.: " +                 MaxPrice + “\nСамый дешевый тур, цена в руб.: " +                 MinPrice + "\nСредняя цена туров: " + AvgPrice);

Запускаем приложение и получаем несколько значений из базы данных (рис. 83).

Рис. 83. Вывод нескольких значений

Когда требуется получать подобные одиночные значения, всегда следует применять метод ExecuteScalar. Такое решение позволяет значительно повысить производительность.

 

 

Метод ExecuteReader

 

Теперь перейдем к рассмотрению следующего метода - ExecuteReader. Он применяется для получения набора записей из базы данных. Особенностью этого метода является то, что он возвращает специальный объект DataReader, с помощью которого просматриваются записи. Для хранения данных, полученных из базы, ранее использовался объект DataSet. Объект DataReader, в отличие от DataSet, требует наличия постоянного подключения для извлечения и просмотра данных, кроме того, он открывает данные только для чтения.

Создадим новое консольное приложение. Полный листинг этого приложения:

using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; using System.Text; namespace ConsoleApplication3 { class Program {           static void Main(string[] args) {             string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename="+                         ©”D:\ВМИ\For ADO\BDTur_firmSQL2.mdf"+ "integrated Security=True;Connect                         Timeout=30;User Instance=True";             string commandText = "SELECT * FROM Туры";             SqlConnection conn = new SqlConnection(connectionString);             conn.Open();             SqlCommand myCommand = conn.CreateCommand();             myCommand.CommandText = "SELECT * FROM Туристы";             SqlDataReader dataReader = myCommand.ExecuteReader();             while (dataReader.Read()) {                         Console.WriteLine(dataReader["Фамилия"]);             }             dataReader.Close();             conn.Close();             Console.ReadKey();           }           } }

Объект dataReader создается в результате вызова метода ExecuteReader объекта myCommand:

SqlDataReader dataReader = myCommand.ExecuteReader();

Перед считыванием первой записи происходит вызов метода Read объекта dataReader и вывод набора записей в консольное окно. Результат выполнения данного приложения представлен на рисунке 84.

Рис. 84. Вывод поля «Фамилия»

Объект DataReader возвращает набор данных типа object, причем для обращения к содержимому поля таблицы вместо имени поля можно использовать индекс:

Console.WriteLine(dataReader[1]);

Перечислим несколько полей:

Console.WriteLine(dataReader[0]); Console.WriteLine(dataReader[1]); Console.WriteLine(dataReader[2]); Console.WriteLine(dataReader[3]);

При выводе они будут располагаться в структурированном виде (рис. 85).

Рис. 85. Вывод содержимого всех полей

Поскольку мы имеем дело с объектами (тип данных object), для вывода записей в виде строк не применимо их простое объединение:

Console.WriteLine(dataReader[0] + dataReader[1] + dataReader[2] + dataReader[3]);

Преобразованные к типу string значения можно объединять:

Console.WriteLine(Convert.ToString(dataReader[0]) + " " +                                                Convert.ToString(dataReader[1]) + " " +                                                Convert.ToString(dataReader[2]) +" " +                                                Convert.ToString(dataReader[3]));

Теперь записи выводятся в более привычном виде (рис. 86).

← Предыдущая
Страница 1
Следующая →

Файл

Основные принципы методологии SADT.docx

Основные принципы методологии SADT.docx
Размер: 219 Кб

.

Пожаловаться на материал

SADT (Structured Analysis and Design Technique) Объектно-ориентированная парадигма. Значение языка UML ADO.NET – основные концепции

У нас самая большая информационная база в рунете, поэтому Вы всегда можете найти походите запросы

Искать ещё по теме...

Похожие материалы:

Проверка агрегатов и механизмов системы пневматического привода тормозов автомобилей

Лабораторная работа. Проверить соответствие испытуемого агрегата заданным техническим условиям по основным параметрам.

Эконометрика, ответы на тест

Эконометрика – это наука, которая дает количественное выражение взаимосвязям экономических явлений и процессов

Менеджмент

История менеджмента. Организации. Содержательные теории мотивации. Групповая динамика. Теории лидерства. Конспект лекций.

Юридична психологія: предмет, система та завдання

Реферат. Педагогічна психологія досліджує психологічні основи навчання та виховання. Методологічні засади юридичної психології. Психологічні аспекти особистості

Неопозитивизм и Постпозитивизм

Философия. Неопозитивизм первой половины 20 в. Концепция Карла Поппера. Постпозитивизм: концепция научных революций Т.Куна. Постпозитивизм: И. Лакатос и П. Фейерабенд.

Сохранить?

Пропустить...

Введите код

Ok