Компонентная модель взаимодействия с БД 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Компонентная модель взаимодействия с БД



Средства доступа к БД

 

Система программирования Borland Delphi (Borland C++ Builder) включает в себя развитые средства для разработки приложений баз данных. С помощью этих средств можно создавать полноценные клиентские приложения баз данных (БД). Среди возможностей таких приложений можно назвать:
• доступ к локальным и удаленным БД;
• представление данных;
• формирование отчетов;
• оперативный анализ данных.
Доступ к БД можно осуществлять с помощью различных технологий. В Borland Delphi 7.0 и Borland C++ Builder 6.0 доступны следующие технологии:
1. BDE (Borland Database Engine). Базовая технология доступа к БД от фирмы Borland. Позволяет получать доступ к реляционным БД с помощью специальных BDE драйверов или через ODBC драйверы. Исторически является первой технологией доступа к БД в средах Borland Delphi и Borland C++ Builder.
2. dbExpress. Более новая и совершенная технология доступа к БД от фирмы Borland. Появилась в 6-й версии Borland Delphi (Borland C++ Builder). По сравнению с BDE обеспечивает более быстрый и удобный доступ к данным.
3. ADO (ActiveX Database Objects). Технология доступа к данным от фирмы Microsoft. В свою очередь базируется на технологии OLE-DB. Обеспечивает удобный и надежный доступ к данным, хотя и несколько более медленный, чем в технологиях BDE и dbExpress. Хорошо подходит для работы с системами управления базами данных (СУБД) от фирмы Microsoft (MS Access, MS SQL Server).
4. InterBase. Специализированная технология доступа к серверу БД Borland InterBase. При работе с этой СУБД обеспечивает
наивысшую производительность по сравнению с другими технологиями.
Кроме того, сторонними фирмами разработано множество других специализированных технологий доступа к БД конкретных СУБД, таких как Oracle, DB2 и других.
Следует отметить, что принципы работы с БД с использованием любой из перечисленных технологий практически одинаковы. В связи с этим основы работы с БД будут рассмотрены на примере технологии BDE, имеющейся в любой версии Borland Delphi (Borland C++ Builder). Получив навыки работы с BDE, перейти к другим технологиям не составляет никакого труда.
Для работы с БД в Borland Delphi (Borland C++ Builder) имеются специальные наборы компонентов, с помощью которых доступны перечисленные выше технологии. Компоненты располагаются на следующих вкладках палитры компонентов:
Data Access. Компоненты доступа к данным. Включает в себя невизуальные компоненты, предназначенные для доступа к данным и являющиеся общими для всех технологий;
BDE. Компоненты доступа к данным с помощью технологии BDE;
dbExpress. Компоненты доступа к данным с помощью технологии dbExpress;
ADO. Компоненты доступа к данным с помощью технологии ADO;
InterBase. Компоненты доступа к данным с помощью технологии InterBase;
Data Controls. Визуальные компоненты представления данных;
Decision Cube. Визуальные и невизуальные компоненты для оперативного анализа;
Quick Reports. Визуальные компоненты для формирования отчетов по БД.
Принципы работы с перечисленными компонентами будут изложены в последующих параграфах.
Обзор утилит в составе Borland Delphi (Borland C++ Builder) для работы с БД
В состав системы программирования Borland Delphi (Borland C++ Builder) включены некоторые утилиты, облегчающие написание приложений БД. К таким утилитам следует отнести:
BDE Administrator. Позволяет создавать и изменять так называемые псевдонимы БД. Подробнее работа с данной утилитой, как и с утилитой SQL Explorer, рассматривается в параграфе «Создание псевдонимов БД».
SQL Explorer. Утилита во многом сходная с BDE Administrator, но помимо создания псевдонимов БД позволяет отлаживать SQL-запросы.
Database Desktop. Утилита, позволяющая создавать и заполнять БД. Хорошо работает только с БД формата Paradox. Для других форматов БД применять не рекомендуется.
Datapump. Утилита, позволяющая конвертировать БД из одного формата в другой. Использование утилиты с современными СУБД не рекомендуется.
SQL Monitor. Позволяет отлаживать SQL-запросы при использовании технологии доступа к БД BDE.
Из перечисленных утилит наиболее полезной является SQL Explorer.

 

Технология BDE

Как уже отмечалось, основы работы с БД в среде Borland Delphi (Borland C++ Builder) будут рассмотрены на примере технологии BDE. Принцип взаимодействия с БД по технологии BDE показан на рис.1.
Приложение взаимодействует с БД через интерфейс BDE, включающий в себя ряд функций, размещенных в специальных DLL библиотеках. Для каждой БД подготавливается так называемый источник данных, представляющий собой структуру данных, содержащую сведения о местоположении, формате и прочих атрибутах БД. Обращение к источнику ведется по псевдониму или, по-другому, альясу. Принципы создания псевдонимов изложены в параграфе «Создание псевдонимов БД». Через указанный в источнике данных драйвер производится обращение к БД. При этом работа с БД производится одинаково для любого формата БД.
Источники данных бывают двух типов: источник данных BDE и источник данных ODBC.
В первом случае используются «родные» драйвера BDE. Реально, такой подход можно порекомендовать только для формата БД Paradox. Для более современных СУБД драйвера BDE или отсутствуют, или ненадежно работают (как, например, с MS Access).

Во втором случае взаимодействие с БД осуществляется посредством промежуточной технологии ODBC. ODBC (Open Database Connectivity) – одна из технологий доступа к БД от фирмы Microsoft. Она обеспечивает достаточно быстрый и надежный доступ к БД различных форматов. Такой подход хотя и несколько снижает скорость доступа к данным из-за наличия дополнительной ступени, однако обеспечивает высокую надежность. Для доступа к БД современных СУБД (MS SQL Server, MS Access, MySQL) такой подход хорошо подходит.


Организация запросов к БД

 

Рассмотрим особенности вызова запросов к БД из приложения. Различают три вида запросов:
• Статические запросы – текст запроса полностью формируется на этапе разработки приложения;
• Параметрические запросы – текст запроса формируется на этапе разработки приложения и содержит несколько параметров, во время выполнения приложения можно задавать значения параметров;
• Динамические запросы – текст запроса полностью формируется на этапе выполнения приложения.
При использовании технологии BDE для выполнения запросов применяется компонент TQuery. При использовании технологии ADO для выполнения запросов могут применяться следующие компоненты:
• Компонент TADOQuery – аналог компонента TQuery. Является наиболее универсальным. Позволяет выполнять любые SQL запросы, включая операторы SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, EXECUTE и др. Текст запроса размещается в свойстве SQL. Содержит свойство Active логического типа, позволяющее выполнить запрос, возвращающий набор данных (оператор SELECT). Метод ExecSQL позволяет выполнить запрос, не возвращающий набор данных.
• Компонент TADODataSet – специализированный компонент для организации запросов на выборку с использованием оператора SELECT. Компонент не позволяет выполнять операторы, не возвращающие наборы данных, такие как: INSERT, UPDATE, DELETE, CREATE TABLE и т.п. Содержит удобный редактор, упрощающий конструирование запросов на выборку. Для вызова редактора используется свойство CommandText. Для выполнения запроса используется свойство Active.
• Компонент TADOCommand – специализированный компонент для организации запросов, не возвращающих набор данных, таких как: INSERT, UPDATE, DELETE, CREATE TABLE и т.п. Компонент не позволяет выполнять оператор SELECT. Метод Execute позволяет выполнить запрос.
Далее рассмотрим порядок организации запросов из приложений БД на основе технологии ADO.


Средства доступа к БД

 

Система программирования Borland Delphi (Borland C++ Builder) включает в себя развитые средства для разработки приложений баз данных. С помощью этих средств можно создавать полноценные клиентские приложения баз данных (БД). Среди возможностей таких приложений можно назвать:
• доступ к локальным и удаленным БД;
• представление данных;
• формирование отчетов;
• оперативный анализ данных.
Доступ к БД можно осуществлять с помощью различных технологий. В Borland Delphi 7.0 и Borland C++ Builder 6.0 доступны следующие технологии:
1. BDE (Borland Database Engine). Базовая технология доступа к БД от фирмы Borland. Позволяет получать доступ к реляционным БД с помощью специальных BDE драйверов или через ODBC драйверы. Исторически является первой технологией доступа к БД в средах Borland Delphi и Borland C++ Builder.
2. dbExpress. Более новая и совершенная технология доступа к БД от фирмы Borland. Появилась в 6-й версии Borland Delphi (Borland C++ Builder). По сравнению с BDE обеспечивает более быстрый и удобный доступ к данным.
3. ADO (ActiveX Database Objects). Технология доступа к данным от фирмы Microsoft. В свою очередь базируется на технологии OLE-DB. Обеспечивает удобный и надежный доступ к данным, хотя и несколько более медленный, чем в технологиях BDE и dbExpress. Хорошо подходит для работы с системами управления базами данных (СУБД) от фирмы Microsoft (MS Access, MS SQL Server).
4. InterBase. Специализированная технология доступа к серверу БД Borland InterBase. При работе с этой СУБД обеспечивает
наивысшую производительность по сравнению с другими технологиями.
Кроме того, сторонними фирмами разработано множество других специализированных технологий доступа к БД конкретных СУБД, таких как Oracle, DB2 и других.
Следует отметить, что принципы работы с БД с использованием любой из перечисленных технологий практически одинаковы. В связи с этим основы работы с БД будут рассмотрены на примере технологии BDE, имеющейся в любой версии Borland Delphi (Borland C++ Builder). Получив навыки работы с BDE, перейти к другим технологиям не составляет никакого труда.
Для работы с БД в Borland Delphi (Borland C++ Builder) имеются специальные наборы компонентов, с помощью которых доступны перечисленные выше технологии. Компоненты располагаются на следующих вкладках палитры компонентов:
Data Access. Компоненты доступа к данным. Включает в себя невизуальные компоненты, предназначенные для доступа к данным и являющиеся общими для всех технологий;
BDE. Компоненты доступа к данным с помощью технологии BDE;
dbExpress. Компоненты доступа к данным с помощью технологии dbExpress;
ADO. Компоненты доступа к данным с помощью технологии ADO;
InterBase. Компоненты доступа к данным с помощью технологии InterBase;
Data Controls. Визуальные компоненты представления данных;
Decision Cube. Визуальные и невизуальные компоненты для оперативного анализа;
Quick Reports. Визуальные компоненты для формирования отчетов по БД.
Принципы работы с перечисленными компонентами будут изложены в последующих параграфах.
Обзор утилит в составе Borland Delphi (Borland C++ Builder) для работы с БД
В состав системы программирования Borland Delphi (Borland C++ Builder) включены некоторые утилиты, облегчающие написание приложений БД. К таким утилитам следует отнести:
BDE Administrator. Позволяет создавать и изменять так называемые псевдонимы БД. Подробнее работа с данной утилитой, как и с утилитой SQL Explorer, рассматривается в параграфе «Создание псевдонимов БД».
SQL Explorer. Утилита во многом сходная с BDE Administrator, но помимо создания псевдонимов БД позволяет отлаживать SQL-запросы.
Database Desktop. Утилита, позволяющая создавать и заполнять БД. Хорошо работает только с БД формата Paradox. Для других форматов БД применять не рекомендуется.
Datapump. Утилита, позволяющая конвертировать БД из одного формата в другой. Использование утилиты с современными СУБД не рекомендуется.
SQL Monitor. Позволяет отлаживать SQL-запросы при использовании технологии доступа к БД BDE.
Из перечисленных утилит наиболее полезной является SQL Explorer.

 

Технология BDE

Как уже отмечалось, основы работы с БД в среде Borland Delphi (Borland C++ Builder) будут рассмотрены на примере технологии BDE. Принцип взаимодействия с БД по технологии BDE показан на рис.1.
Приложение взаимодействует с БД через интерфейс BDE, включающий в себя ряд функций, размещенных в специальных DLL библиотеках. Для каждой БД подготавливается так называемый источник данных, представляющий собой структуру данных, содержащую сведения о местоположении, формате и прочих атрибутах БД. Обращение к источнику ведется по псевдониму или, по-другому, альясу. Принципы создания псевдонимов изложены в параграфе «Создание псевдонимов БД». Через указанный в источнике данных драйвер производится обращение к БД. При этом работа с БД производится одинаково для любого формата БД.
Источники данных бывают двух типов: источник данных BDE и источник данных ODBC.
В первом случае используются «родные» драйвера BDE. Реально, такой подход можно порекомендовать только для формата БД Paradox. Для более современных СУБД драйвера BDE или отсутствуют, или ненадежно работают (как, например, с MS Access).

Во втором случае взаимодействие с БД осуществляется посредством промежуточной технологии ODBC. ODBC (Open Database Connectivity) – одна из технологий доступа к БД от фирмы Microsoft. Она обеспечивает достаточно быстрый и надежный доступ к БД различных форматов. Такой подход хотя и несколько снижает скорость доступа к данным из-за наличия дополнительной ступени, однако обеспечивает высокую надежность. Для доступа к БД современных СУБД (MS SQL Server, MS Access, MySQL) такой подход хорошо подходит.


Компонентная модель взаимодействия с БД

 

Как уже отмечалось, взаимодействие приложения с БД осуществляется с помощью специальных компонентов. На рис. 2 показана обобщенная компонентная модель взаимодействия приложения с БД.

Уровень базы данных реализуется с помощью компонента типа TDatabase. Предназначен для синхронизации подключения к нескольким наборам данных (таблицам, запросам, хранимым процедурам). Также позволяет настраивать параметры соединения с БД. Как правило, уровень используется при работе с удаленными БД. При работе с локальными БД в явном виде может не использоваться.
Уровень набора данных реализуется с помощью компонентов, относящихся к базовому типу TDataSet. К таким компонентам относятся: TTable (таблица БД), TQuery (запрос к БД), TStoredProc (вызов хранимой процедуры). Уровень предназначен для получения набора записей, сформированного тем или иным способом.
Уровень источника данных реализуется с помощью компонента TDataSource. Служит связующим звеном между визуальными компонентами уровня представления данных и невизуальными компонентами уровня набора данных. Позволяет
синхронно подключить несколько компонентов представления данных к тому или иному набору данных.
Уровень представления данных реализуется с помощью компонента TDBGrid. Позволяет в том или ином виде отобразить на экране данные, извлеченные из БД. Также позволяет редактировать данные.
В Borland Delphi (Borland C++ Builder) реализована концепция «живых данных». В соответствии с этой концепцией уже на этапе разработки приложения осуществляется подключение к БД. При этом содержимое БД может сразу же отображаться в компонентах представления данных.

Как уже отмечалось ранее, взаимодействие приложения с БД осуществляется через источник данных, для которого задается уникальное на компьютере имя – псевдоним или, по-другому, альяс. Понятия псевдоним и источник данных часто отождествляют. Псевдонимы могут создаваться как с помощью утилиты BDE Administrator, так и с помощью утилиты SQL Explorer. Для обеих утилит этот процесс совершенно аналогичен.
Рассмотрим процесс создания псевдонимов. Откроем SQL Explorer, выбрав пункт Explorer из меню Database Delphi (C++Builder). Выберем пункт ODBC Administrator меню Object. Если данная операция запрещена, то необходимо запустить утилиту C: \WINNT\SYSTEM32\odbcad32.exe. На вкладке Пользовательский DSN нажмем кнопку Добавить. В открывшемся окне (рис. 3) выберем тип драйвера Microsoft SQL Server (или SQL Server) и нажмем кнопку Готово.
Далее (рис. 4) будет предложено ввести имя псевдонима БД, под которым к ней будем обращаться из клиентских приложений и имя сервера (например, WS208).

В качестве имени псевдонима следует указать какое-либо осмысленной буквосочетание, например, Supply, Transport, Нotel и т.д. В следующем окне необходимо выбрать пункт Проверка подлинности учетной записи SQL Server, что означает, что для доступа к серверу будет использовано имя и пароль, задаваемые на сервере, а не имя и пароль, под которым входили в систему. Следует также убрать флажок напротив надписи Получить параметры, используемые по умолчанию от SQL Server, чтобы не указывать имя и пароль для доступа к БД с расширенными полномочиями (в нашем случае это не надо).
В последующих окнах нужно все оставить без изменения, нажимая кнопку Далее и в конце Готово. Альяс будет создан. Обратите внимание, что в окне SQL Explorer альяс пока не появился (появится после закрытия и нового открытия приложения). Следует закрыть SQL Explorer и Borland Delphi (Borland C++Builder).
Далее следует связать альяс с уже созданной базой данных. Во всех рассматриваемых в дальнейшем примерах используется БД Поставка товаров, схема которой представлена на рис. 5.

Для лучшего усвоения материала необходимо создать БД Поставка товаров в СУБД SQL Server 2000. Содержимое таблиц представлено в табл. 1–3.


Далее установления связи альяса с базой данных нужно вновь открыть утилиту SQL Explorer, выбрать свой псевдоним (например, Supply) и ввести необходимые сведения о своей базе (рис. 6):
DATABASE NAME Поставка товаров (имя БД на сервере)
USER NAME sa (имя пользователя сервера)

Утвердить изменения, выбрав пункт Apply меню Object. Следует отметить, что эти сведения можно было ввести и раньше, при создании псевдонима.
Дважды щелкнуть по своему псевдониму, после чего в открывшемся окне ввести пароль, например, sa. Произойдет подключение к удаленной БД. Если в результате попытки подключения произойдет ошибка, повторить попытку.
В левой части окна выбрать пункт Tables и просмотреть сведения об имеющихся в БД таблицах (рис. 7). Просмотреть свойства своих таблиц (структуру полей).
С помощью утилиты SQL Explorer можно также отлаживать SQL запросы. Рассмотрим этот процесс.
С целью настройки программы на нормальное отображение русских букв выбрать пункт Text Font меню View и выбрать шрифт Courier вместо Courier New.
В правой части окна выбрать вкладку Enter SQL (рис. 8). В соответствующем поле ввода ввести текст SQL-запроса, после чего нажать кнопку (выполнить). В нижней правой части окна появятся результаты выполнения запроса. Далее можно вводить новый запрос. Список введенных запросов можно листать кнопками (стрелка вверх) и (стрелка вниз).


Теперь созданный псевдоним можно использовать в клиентских приложениях для доступа к БД

Скрипт создания базы данных Кинотеатры:

 

Use master
go

create database Kino2
on
(Name='Kino2_data',
Filename='d:\users\stud\547\Kino2_data.mdf',
SIZE=4,
MAXSIZE=10,
FILEGROWTH=1)
LOG ON
(NAME='Kino2_log',
FILENAME='d:\users\stud\547\Kino2_data.ldf', SIZE=4, MAXSIZE=10, FILEGROWTH=1)
GO
USE Kino2_data
GO


CREATE TABLE [dbo].[Кинотеатры] (
[№кинотеатра] [int] NOT NULL,
[название кинотеатра] [char] (10) COLLATE Cyrillic_General_CI_AS NOT NULL,
[адрес] [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL,
[телефон кассы] [char] (10) COLLATE Cyrillic_General_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Сеансы] (
[№кинотеатра] [int] NOT NULL,
[код фильма] [int] NOT NULL,
[номер сеанса] [int] NOT NULL,
[дата показа] [datetime] NOT NULL,
[время показа] [datetime] NOT NULL,
[стоимость] [money] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Фильмы] (
[Код фильма] [int] NOT NULL,
[название] [char] (100) COLLATE Cyrillic_General_CI_AS NOT NULL,
[страна] [char] (10) COLLATE Cyrillic_General_CI_AS NOT NULL,
[год выпуска] [char] (10) COLLATE Cyrillic_General_CI_AS NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Кинотеатры] WITH NOCHECK ADD
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
[№кинотеатра]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Сеансы] WITH NOCHECK ADD
CONSTRAINT [PK_Сеансы] PRIMARY KEY CLUSTERED
(
[№кинотеатра],
[код фильма]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Фильмы] WITH NOCHECK ADD
CONSTRAINT [PK_Фильмы] PRIMARY KEY CLUSTERED
(
[Код фильма]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Сеансы] ADD
CONSTRAINT [FK_Сеансы_Кинотеатры] FOREIGN KEY
(
[№кинотеатра]
) REFERENCES [dbo].[Кинотеатры] (
[№кинотеатра]
) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT [FK_Сеансы_Фильмы] FOREIGN KEY
(
[код фильма]
) REFERENCES [dbo].[Фильмы] (
[Код фильма]
) ON DELETE CASCADE ON UPDATE CASCADE
GO


-- Создание умолчания
CREATE DEFAULT D1 AS 0 GO
-- Привязка умолчания к объектам
EXEC sp_bindefault 'D1','Сеансы.Стоимость'
GO
-- Создание правила
CREATE RULE R1 AS @X LIKE '[А-Я, а-я]%'
GO
-- Привязка правила к объектам
EXEC sp_bindrule 'R1','Кинотеатры.[название кинотеатра]'
go

 

 

Заполнение базы:

 

USE Kino2
GO
-- Заполнение таблицы Поставщики
INSERT INTO Кинотеатры ([№кинотеатра], [Название кинотеатра], Адрес, [Телефон кассы])
VALUES (1, 'Прогресс', 'Рязань', '451234')
INSERT INTO Кинотеатры ([№кинотеатра], [Название кинотеатра], Адрес, [Телефон кассы])
VALUES (2, 'Ока', 'Рязань', '920140')
INSERT INTO Кинотеатры ([№кинотеатра], [Название кинотеатра], Адрес, [Телефон кассы])
VALUES (3, 'Уют', 'Москва', '7651044')
INSERT INTO Кинотеатры ([№кинотеатра], [Название кинотеатра], Адрес, [Телефон кассы])
VALUES (4, 'Быт', 'Липецк', '381855')

-- Заполнение таблицы Товары
INSERT INTO Фильмы ([Код фильма], Название, страна, [год выпуска])
VALUES (1, 'Ложка', 'Китай', 10)
INSERT INTO Фильмы ([Код фильма], Название, страна, [год выпуска])
VALUES (2, 'Вилка', 'Китай', 12)
INSERT INTO Фильмы ([Код фильма], Название, страна, [год выпуска])
VALUES (3, 'Тарелка', 'Россия', 100)
INSERT INTO Фильмы ([Код фильма], Название, страна, [год выпуска])
VALUES (4, 'Нож', 'Китай', 50)

-- Заполнение таблицы Поставки
INSERT INTO Сеансы ([№кинотеатра], [код фильма], [номер сеанса], [дата показа],[время показа], стоимость)
VALUES (2, 1, 1,'16.06.2007','15:20:00', 100)
INSERT INTO Сеансы ([№кинотеатра], [код фильма], [номер сеанса], [дата показа],[время показа], стоимость)
VALUES (2, 2, 2,'16.06.2007','15:20:00', 200)
INSERT INTO Сеансы ([№кинотеатра], [код фильма], [номер сеанса], [дата показа],[время показа], стоимость)
VALUES (3, 1, 3,'16.06.2007','15:20:00', 200)

 

Рассмотрим более подробно компоненты доступа к данным с помощью технологии BDE. К наиболее используемым компонентам относятся: TTable, TQuery, TStoredProc, TDataSource.
Компоненты TTable, TQuery, TStoredProc, относящиеся к уровню набора данных, имеют общий родительский класс TDataSet. У перечисленных компонентов есть много общих свойств и методов. Рассмотрим наиболее важные из них.
Свойство Active – логического типа. Если принимает значение true, то набор данных активен, т.е. записи в нем доступны для считывания.
Свойство DatabaseName – позволяет задать псевдоним БД, с которой работает набор данных.
В компоненте TTable добавлено свойство ТаbleName – имя таблицы БД, с которой работает компонент.
В компоненте TQuery добавлено свойство SQL – текст SQL-запроса.
В компоненте TStoredProc добавлено свойство StoredProcName – имя хранимой процедуры.

Компонент TDataSource имеет важнейшее свойство DataSet, позволяющее присоединить источник данных к требуемому набору данных. К одному набору данных может быть присоединен только один компонент источника данных.




Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 136; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.42.94 (0.041 с.)