Разработка информационной системы 'Археологический музей'

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    740,82 Кб
  • Опубликовано:
    2015-12-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка информационной системы 'Археологический музей'

Министерство образования и науки Российской Федерации

ФГБОУ ВПО Кубанский государственный технологический университет

(КубГТУ)

Кафедра Информационных систем и программирования

Институт Компьютерных систем и информационной безопасности





ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

Базы данных

на тему Разработка ИС "Археологический музей"












г.

Реферат

РЕЛЯЦИОННАЯ БАЗА ДАННЫХ, VISUAL STUDIO 2015, MICROSOFT SQL SERVER 2012

Пояснительная записка курсового проекта содержит

стр., 11 рис., 2 табл., 5 источников.

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

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

Содержание

Введение

1. Нормативные ссылки

. Анализ предметной области и требований

2.1 Цель автоматизации

.2 Перечень задач/процессов, подлежащих автоматизации в рамках курсового проектирования

.3 Участники автоматизируемых процессов

.4 Концептуальная модель БД с описанием

3. Разработка базы данных и программных приложений к ней

3.1 Логическая модель БД с описанием

.2 ER-диаграмма с описанием

.3 Перечень функций программы

4. Руководство пользователя

Заключение

Список использованных источников

Приложение

Введение


В данном курсовом проекте будут исследованы основные понятия проектирования реляционных баз данных, алгоритма создания и редактирования баз данных с помощью СУБД Microsoft SQL Server 2012. На первом этапе будет проведено исследование основного теоретического материала по данным темам, а также изучение основных алгоритмов. Эти исследования будут проводиться с помощью источников, указанных как рекомендованные.

Затем для демонстрации работы алгоритмов будет написана необходимая программа на языке программирования C# в среде Visual Studio2015. По окончании сборки необходимой программы будет проведено тестирование.

база данные программный музей

1. Нормативные ссылки


ГОСТ Р 1.5-2004 Стандарты национальные Российской Федерации. Правила построения, изложения, оформления и обозначения

ГОСТ 2.104-68 ЕСКД. Основные надписи

ГОСТ 7.80-2000 СИБИД. Библиографическая запись. Заголовок. Общие требования и правила составления

ГОСТ 7.82-2001 СИБИД. Библиографическая запись. Библиографическое описание электронных ресурсов. Общие требования и правила составления

ГОСТ 7.9-95 СИБИД. Реферат и аннотация. Общие требования

ГОСТ 19.001-77 ЕСПД. Общие положения

ГОСТ 19.104-78 ЕСПД. Основные надписи

ГОСТ 19.105-78 ЕСПД. Общие требования к программным документам

ГОСТ 19.401-78 ЕСПД. Текст программы. Требования к содержанию и оформлению

ГОСТ 19.402-78 ЕСПД. Описание программы

ГОСТ 19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению

2. Анализ предметной области и требований

 

.1 Цель автоматизации


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

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

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

 

.2 Перечень задач/процессов, подлежащих автоматизации в рамках курсового проектирования


При проектировании системы основной задачей являлось автоматизирование следующих процессов:

-       ведение полной базы экспонатов, находящихся в музее;

-       ведение базы, содержащей информацию об археологах;

-       ведение и дополнение базы университетов;

-       возможность модификации данных в таблицах;

-       поддержка многопользовательности;

 

2.3 Участники автоматизируемых процессов


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

Основные варианты использования, доступные участникам автоматизируемого процесса, представлены на диаграмме (рис. 1).

Рисунок 1 - Диаграмма вариантов использования

Администратор может полностью редактировать базу данных, он может добавлять новые элементы или удалять их. Пользователь же может просматривать полный перечень представленных в музее экспонатов, а также видеть подробную информацию о каждом из них.

2.4 Концептуальная модель БД с описанием


Т а б л и ц а 1 - Объекты концептуальной модели

Объект

Атрибуты

Первичный ключ

University

ID Name City

ID

Place

ID Name

ID

KindOfEra

ID

ExType

ID Name

ID

Exhibit

ID Name AgeID ExTypeID PlaceID ArchaeologistID

ID

Era

ID Name BeginDate EndDate KindOfEraID

ID

Archaeologist

ID Name Age UniversityID

ID

ApplicationUser

ID Name Login Password

ID


Т а б л и ц а 2 - Связи концептуальной модели

Связь

Объекты

Показатель кардинальности

Степень участия

Contain_EE

Exhibit AgeID

1 : N 1 : N

Полная Полная

Contain_RE

Exhibit ExTypeID

1 : N 1 : N

Полная Полная

Contain_ER

Exhibit PlaceID

1 : N 1 : N

Полная Полная

Contain_RR

Exhibit ArchaeologistID

1 : N 1 : N

Полная Полная

Have_EE

Archaeologist UniversityID

1 : N 1 : N

Полная Полная

Have_RE

Era BeginDate

1 : N 1 : N

Полная Полная

Have_ER

Era EndDate

1 : N 1 : N

Полная Полная

Have_RR

Era KindOfEraID

1 : N 1 : N

Полная Полная


На рисунке 2 представлена концептуальная модель базы данных.

Рисунок 2 - Концептуальная модель БД

3. Разработка базы данных и программных приложений к ней


3.1 Логическая модель БД с описанием


На данном этапе производится упрощение концептуальной модели, а затем ее преобразование в реляционную модель.

В реляционной модели данных (РБД) связь типа "многие ко многим" не может быть представлена напрямую. Она убирается путем добавления новых таблиц.

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

Рисунок 3 - Логическая модель БД

Основные объекты базы данных:

)        "Archaeologist" используется для хранения данных об археологах. Данная таблица содержит идентификатор, имя и возраст археолога, а также ссылку на университет, в котором он работает.

)        "University" содержит данные об университетах. Данная таблица содержит идентификатор, название и город, в котором находится университет.

)        "Exhibit" используется для хранения экспонатов. Данная таблица хранит уникальный идентификатор, наименование, место нахождения, автора раскопки, тип и эпоху, к которой принадлежит экспонат.

)        "Place" используется для хранения мест раскопок. Данная таблица хранит уникальный идентификатор и наименование места нахождения.

)        "Era" используется для хранения эпох. Данная таблица хранит уникальный идентификатор и наименование эпохи, врем начала и конца эпохи, а также тип, к которому принадлежит.

)        "KindOfEra" используется для хранения типов эпох. Данная таблица хранит уникальный идентификатор и наименование типа эпохи.

)        "ExType" используется для хранения типов экспонатов. Данная таблица хранит уникальный идентификатор и наименование типа экспоната.

 

.2 ER-диаграмма с описанием


На основе расширенной концептуальной модели создаем БД "Crocodile" в Microsoft SQL Server 2012. Диаграмма БД выглядит следующим образом (рис. 4):

Рисунок 4 - Реляционная модель БД

3.3 Перечень функций программы


Проектируемое клиент-серверное приложение должно выполнять следующие функции:

)        Осуществление аутентификации;

)        Вывод всех экспонатов;

)        Выбор нужной таблицы из всех таблиц базы;

)        Добавление элементов в выбранную таблицу;

)        Изменение и удаление выбранного элемента;

)        Поиск по имени элемента.

4. Руководство пользователя


При запуске приложения пользователь видит стартовое окно, в котором представлен список всех экспонатов (рис. 5).

Рисунок 5 - Стартовое окно программы

Нажав на экспонат можно увидеть подробную информацию о нём (рис. 6).

Рисунок 6 - Подробная информация об экспонате

Для того, чтобы иметь возможность просматривать таблицы, необходимо иметь учётную запись менеджера, нажав на "Login" в правой верхней части экрана вводим логин "manager" и пароль "manager" (рис. 7).

Рисунок 7 - Аутентификация

Менеджер имеет привилегии только для просмотра содержимого таблиц (рис. 8).

Рисунок 8 - Управление с учётной записью менеджера

Для того, чтобы иметь возможность модифицировать таблицы, необходимо авторизоваться под учётной записью администратора (логин "admin" пароль "admin"), нажав на "Login" в правой верхней части экрана (рис. 9).

Рисунок 9 - Окно управления

Для изменения элемента необходимо нажать кнопку "Edit" (рис. 10).

Рисунок 10 - Изменение элемента

При попытке удаления программа просит подтверждения, после получения которого удаляет элемент из таблицы (рис. 11).

Рисунок 11 - Изменение элемента

Заключение


В заключении хочется отметить важность использования реляционных баз данных. Благодаря существованию такого понятия, как базы данных, многие процессы могут быть легко автоматизированы, что достаточно полезно для самых различных предприятий и компаний. В современном мире сильно ощутим информационный рывок. Нас стал окружать огромный объем информации. Информация для человека играет немаловажную роль, поэтому основной из задач человечества является обработка данной информации.

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

Данная работа позволила нам еще раз убедиться в актуальности изученной темы.

Список использованных источников


1.      Малыхина М.П. Базы данных: основы, проектирование, использование: учебное пособие".-3-е изд. СПб.: БХВ-Петербург, 2007. -528 с.

2.        Роберт Уолтерс и др. SQL Server 2012: ускоренный курс для профессионалов./Пер. с англ. - М.: Издательский дом "Вильямс", 2014. -768 с.

3.      Александр Волоха. Microsoft SQL Server 2012. Новые возможности. - СПб: Питер, 2012.- 304 с.

4.        Сеппа Д. Microsoft ADO.BET/Пер. с англ.- М.; Издательско-торговый дом "Русская редакция", 2003. -640 стр.

5.      Нейгел, Кристиан, Ивьен, Билл, Глинн, Джей, Скиннер, Уотсон, Карли. C# 2005 и платформа .NET 3.0 для профессионалов.; Пер. с англ. - М.: ООО "И.Д.Вильямс", 2008.- 1376+416 (на CD) с.: ил.

Приложение А


Листинг программы:

Класс MainViewModel:

using ArchMuseumManager.Infrastructure;System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.DAL.Entities;System.Collections.ObjectModel;System.Windows;MahApps.Metro;ArchMuseumManager.ViewModels

{class MainViewModel : BaseViewModel

{bool isLogging;bool IsLogging

{{ return isLogging; }{ isLogging = value; NotifyPropertyChanged(); }

}ApplicationUser currentUser;ApplicationUser CurrentUser

{{ return currentUser; }{ currentUser = value; NotifyPropertyChanged(); }

}Exhibit selectedExhibit;Exhibit SelectedExhibit

{{ return selectedExhibit; }{ selectedExhibit = value; NotifyPropertyChanged(); }

}ObservableCollection<Exhibit> Exhibits

{{ return Repository.Exhibits; }{ NotifyPropertyChanged(); }

}void Login(string login, string password)

{user = Repository.Users.FirstOrDefault(u => u.Login == login && u.Password == password);(user == null)

{.Show("Incorrect login");;

}

{= user;= false;();

}

}void ChangeWindowTheme()

{theme = ThemeManager.DetectAppStyle(Application.Current);(CurrentUser != null)

{.ChangeAppStyle(Application.Current,.GetAccent("Mauve"),.GetAppTheme("BaseLight"));

}

{.ChangeAppStyle(Application.Current,.GetAccent("Olive"),.GetAppTheme("BaseLight"));

}

}RelayCommand logOutCommand;RelayCommand LogOutCommand

{

{(logOutCommand == null)= new RelayCommand(p => LogOut());logOutCommand;

}

}void LogOut()

{= null;();

}RelayCommand readMoreCommand;RelayCommand ReadMoreCommand

{

{(readMoreCommand == null)= new RelayCommand(p => ReadMore(p));readMoreCommand;

}RelayCommand closeReadMoreCommand;RelayCommand CloseReadMoreCommand

{

{(closeReadMoreCommand == null)= new RelayCommand(p => SelectedExhibit = null);closeReadMoreCommand;

}

}RelayCommand openLoginDialogCommand;RelayCommand OpenLoginDialogCommand

{

{(openLoginDialogCommand == null)= new RelayCommand(p => IsLogging = true, p => CurrentUser == null);openLoginDialogCommand;

}

}RelayCommand closeLoginDialogCommand;RelayCommand CloseLoginDialogCommand

{

{(closeLoginDialogCommand == null)= new RelayCommand(p => IsLogging = false, p => CurrentUser == null);closeLoginDialogCommand;

}

}RelayCommand openManageWindowCommand;RelayCommand OpenManageWindowCommand

{

{(openManageWindowCommand == null)= new RelayCommand(p => OpenManageWindow(), p => CurrentUser != null);openManageWindowCommand;

}

}void OpenManageWindow()

{window = new ManageWindow();viewModel = new ManageViewModel();.IsAdmin = CurrentUser.Login == "admin";.DataContext = viewModel;.ShowDialog();= new EFRepository();= Repository.Exhibits;

}void ReadMore(object p)

{exhibit = p as Exhibit;(exhibit != null)

{= exhibit;

}

}MainViewModel()

{

//CurrentUser = Repository.Users.FirstOrDefault(u => u.Login == "admin");();

}

}

}

Класс ManageBaseViewModel:

using ArchMuseumManager.DAL.Entities;ArchMuseumManager.Infrastructure;ArchMuseumManager.Models;Newtonsoft.Json;System;System.Collections.Generic;System.ComponentModel;System.Linq;System.Text;System.Threading.Tasks;System.Windows;System.Windows.Data;System.Windows.Input;ArchMuseumManager.ViewModels

{class ManageBaseViewModel<T>:BaseViewModel where T: class, IEntity, new()

{DefaultMapper Mapper { get; set; } = new DefaultMapper();T current;T Current

{{ return current; }{ current = value; NotifyPropertyChanged(); }

}ICollectionView entities;EFRepository repository;ICollectionView Entities

{

{(entities == null)

{= CollectionViewSource.GetDefaultView(repository.GetDbSet<T>());.Filter = Search_Filter;

}entities;

}{ entities = value; NotifyPropertyChanged(); }

}string searchCriteria;string SearchCriteria

{{ return searchCriteria; }{ searchCriteria = value; NotifyPropertyChanged(); Entities.Refresh(); }

}bool Search_Filter(object item)

{(item != null)

{name = (item as IEntity).Name.ToString().ToLower();SearchCriteria != null ? name.StartsWith(SearchCriteria.ToLower()) : true;

}false;

}ManageBaseViewModel(EFRepository repository)

{.repository = repository;

}ICommand saveCommand;ICommand SaveCommand

{

{(saveCommand == null)

{= new RelayCommand(o => Save(), o => CanSave(o));

}saveCommand;

}

}ICommand closeFormsCommand;ICommand CloseFormsCommand

{

{(closeFormsCommand == null)

{= new RelayCommand(o => { CloseForms(); });

}closeFormsCommand;

}

}ICommand addCommand;ICommand AddCommand

{

{(addCommand == null)

{= new RelayCommand(o => { Current = new T() { ID = -1}; });

}addCommand;

}

}ICommand editCommand;ICommand EditCommand

{

{(editCommand == null)

{= new RelayCommand(o => Edit(o));

}editCommand;

}ICommand deleteCommand;ICommand DeleteCommand

{

{(deleteCommand == null)

{= new RelayCommand(o => Delete(o));

}deleteCommand;

}

}void Delete(object o)

{entity = o as T;(entity != null)

{status = MessageBox.Show("Are you sure want to remove this item?", "Removing", MessageBoxButton.YesNo);(status == MessageBoxResult.No) return;(status == MessageBoxResult.Yes)

{exhibitToDelete = repository.GetDbSet<T>().FirstOrDefault(op => op.ID == entity.ID);.Delete(exhibitToDelete);

}

}

}void Edit(object o)

{entity = o as T;(entity != null)

{entityCopy = new T();(entity, entityCopy);= entityCopy;

}

}void Map(T source, T destination)

{type = typeof(T);properties = type.GetProperties();(var property in properties)

{.SetValue(destination, property.GetValue(source));

}

}void CloseForms()

{= null;

}bool CanSave(object o)

{Current != null && Current.IsValid();

}void Save()

{(Current.ID == -1)

{.Create(Current);.Refresh();

}

{entity = repository.GetDbSet<T>().FirstOrDefault(o => o.ID == Current.ID);(Current, entity);

//Mapper.Map(Current, entity);.Update(entity);

}= null;

}

}

}

Класс ManageViewModel:

using ArchMuseumManager.DAL.Entities;ArchMuseumManager.Infrastructure;System;System.Collections.Generic;System.Collections.ObjectModel;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.ViewModels

{class ManageViewModel : BaseViewModel

{

#region CollectionsObservableCollection<Exhibit> Exhibits

{{ return Repository.Exhibits; }{ NotifyPropertyChanged(); }

}ObservableCollection<KindOfEra> KindOfEras

{{ return Repository.KindOfEras; }{ NotifyPropertyChanged(); }

}ObservableCollection<ExType> ExTypes

{{ return Repository.ExTypes; }{ NotifyPropertyChanged(); }

}ObservableCollection<Era> Eras

{{ return Repository.Eras; }{ NotifyPropertyChanged(); }

}ObservableCollection<Archaeologist> Archaeologists

{{ return Repository.Archaeologists; }{ NotifyPropertyChanged(); }

}ObservableCollection<University> Universities

{{ return Repository.Universities; }{ NotifyPropertyChanged(); }

}ObservableCollection<Place> Places

{{ return Repository.Places; }{ NotifyPropertyChanged(); }

}

#endregionbool isAdmin;bool IsAdmin

{{ return isAdmin; }{ isAdmin = value; NotifyPropertyChanged(); }

}

#region ViewModelsManageBaseViewModel<Exhibit> exhibitsViewModel;ManageBaseViewModel<Exhibit> ExhibitsViewModel

{{ return exhibitsViewModel; }{ exhibitsViewModel = value; NotifyPropertyChanged(); }

}ManageBaseViewModel<KindOfEra> kindOfErasViewModel;ManageBaseViewModel<KindOfEra> KindOfErasViewModel

{{ return kindOfErasViewModel; }{ kindOfErasViewModel = value; NotifyPropertyChanged(); }

}ManageBaseViewModel<Archaeologist> archaeologistsViewModel;ManageBaseViewModel<Archaeologist> ArchaeologistsViewModel

{{ return archaeologistsViewModel; }{ archaeologistsViewModel = value; NotifyPropertyChanged(); }

}ManageBaseViewModel<Era> erasViewModel;ManageBaseViewModel<Era> ErasViewModel

{{ return erasViewModel; }{ erasViewModel = value; NotifyPropertyChanged(); }

}ManageBaseViewModel<ExType> exTypesViewModel;ManageBaseViewModel<ExType> ExTypesViewModel

{{ return exTypesViewModel; }{ exTypesViewModel = value; NotifyPropertyChanged(); }

}ManageBaseViewModel<Place> placesViewModel;ManageBaseViewModel<Place> PlacesViewModel

{{ return placesViewModel; }{ placesViewModel = value; NotifyPropertyChanged(); }

}ManageBaseViewModel<University> universitiesViewModel;ManageBaseViewModel<University> UniversitiesViewModel

{{ return universitiesViewModel; }{ universitiesViewModel = value; NotifyPropertyChanged(); }

#endregionManageViewModel()

{= new ManageBaseViewModel<Exhibit>(Repository);= new ManageBaseViewModel<KindOfEra>(Repository);= new ManageBaseViewModel<Archaeologist>(Repository);= new ManageBaseViewModel<Era>(Repository);= new ManageBaseViewModel<ExType>(Repository);= new ManageBaseViewModel<Place>(Repository);= new ManageBaseViewModel<University>(Repository);

}

}

}

Класс Exhibit:

using System;System.Collections.Generic;System.ComponentModel;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.DAL.Entities

{class Exhibit: ObservableObject, IEntity

{int id;int ID

{{ return id; }{ id = value; NotifyPropertyChanged(); }

}string name;string Name

{{ return name; }{ name = value; NotifyPropertyChanged(); }

}int ageID;int AgeID

{{ return ageID; }{ ageID = value; NotifyPropertyChanged(); }

}int exTypeID;int ExTypeID

{{ return exTypeID; }{ exTypeID = value; NotifyPropertyChanged(); }

}int placeID;int PlaceID

{{ return placeID; }{ placeID = value; NotifyPropertyChanged(); }

}int archaeologistID;int ArchaeologistID

{{ return archaeologistID; }{ archaeologistID = value; NotifyPropertyChanged(); }

}Era age;virtual Era Age

{{ return age; }{ age = value; NotifyPropertyChanged(); }

}Archaeologist archaeologist;virtual Archaeologist Archaeologist

{{ return archaeologist; }{ archaeologist = value; NotifyPropertyChanged(); }

}Place place;virtual Place Place

{{ return place; }{ place = value; NotifyPropertyChanged(); }

}ExType exType;virtual ExType ExType

{{ return exType; }{ exType = value; NotifyPropertyChanged(); }

}override string ToString()

{Name;

}bool IsValid()

{!string.IsNullOrWhiteSpace(Name)

&& Age != null

&& Archaeologist != null

&& Place != null

&& ExType != null;

}

}

}

Класс ExType:

using System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;ArchMuseumManager.DAL.Entities

{class ExType : ObservableObject, IEntity

{int id;int ID

{{ return id; }{ id = value; NotifyPropertyChanged(); }

}string name;string Name

{{ return name; }{ name = value; NotifyPropertyChanged(); }

}override string ToString()

{Name;

}bool IsValid()

{!string.IsNullOrWhiteSpace(Name);

}

}

}

Реализованные транзакции:NOCOUNT ON;

-Состояние до начала транзакции

'До транзацкии' AS "Состояние"

,ExTypeID AS "Код"

,Name AS "Имя"

,@@SPID AS "Процесс"

,@@TRANCOUNT AS "Количество транзакций"

FROM ArchMuseum.DBO.Exhibits ORDER BY ExTypeID;

--Начало транзакцииTRANSACTION;

@@TRANCOUNT AS "Количество транзакций";

UPDATE ArchMuseum.DBO.ExhibitsExTypeID -= 0Name=N'Computer';

'До транзацкии' AS "Состояние"

,ExTypeID AS "Код"

,Name AS "Имя"

,@@SPID AS "Процесс"

,@@TRANCOUNT AS "Количество транзакций"

FROM ArchMuseum.DBO.Exhibits ORDER BY ExTypeID;ArchMuseum.DBO.ExhibitsExTypeID += 0Name =N'Nature';

,ExTypeID AS "Код"

,Name AS "Имя"

,@@SPID AS "Процесс"

,@@TRANCOUNT AS "Количество транзакций"

FROM ArchMuseum.DBO.Exhibits ORDER BY ExTypeID;

Похожие работы на - Разработка информационной системы 'Археологический музей'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!