КУРСОВОЕ ПРОЕКТИРОВАНИЕ
По дисциплине
«Базы данных»
Тема
“Тестирование”
Вариант №7
/>Содержание
Задание
Результаты анализа предметной области
Описание выполнения этапов проектирования
Концептуальная модель
Описание реляционной модели
Описание реализации запросов
Описание групп пользователей
Описание интерфейса
Описание контрольного пример
Сообщения программы
Тексты программы
Задание. Вариант №7
Предметная область «Тестирование». Возможные видыдеятельности: ведение базы вопросов, распределенных по предметам, темам иуровням, и ответов (возможных и правильных) с указанием авторов вопросов; учетвыполненного тестирования для каждого обучаемого с информацией о полученных имвопросах, данных ответах и общих результатах; формирование тестов из имеющихсявопросов.
Результаты анализа предметной области с описанием требований,правил предметной области, объектов, их атрибутов и взаимосвязей между ними.
Согласно заданиюпрограммный продукт должен выполнять следующие функции :
-деятельности: ведение базы вопросов, распределенных попредметам, темам и уровням, и ответов (возможных и правильных) с указаниемавторов вопросов
-учет выполненного тестирования для каждого обучаемого синформацией о полученных им вопросах, данных ответах и общих результатах
-формирование тестов из имеющихся вопросов.
При этом былисформированы следующие объекты:
-Участник тестирования
-Тест
-Вопрос
-Ответ
-Автор
-Тема
-Уровень
-Предмет
Описание выполненныхэтапов проектирования БД.
После анализа предметнойобласти указанные ранее объекты были преобразованы в таблицы базы данных.
Таблица-Первичный ключ
Участник-Ид участника
Тест-Ид теста
Вопрос-Ид вопроса
Ответ-Ид ответа
Автор-Ид автора
Тема-Ид темы
Уровень-Ид уровня
Предмет-Ид предмета
Выбор этих ключейобеспечивает уникальность записей в каждой из таблиц.
Так же для созданиясвязей N:M были сформированы таблицы Тест-Вопрос и Вопрос-Ответ.
Поля таблиц были выбраны с учётом нормализации отношений,таблицы не содержат избыточных данных и не могут привести к различныманомалиям.
Концептуальная модельданных:
/>
Описание реляционноймодели данныхУчастник Поле Описание Тип данных Комментарий ID_member Ид участника Текстовый Ид участника FIO ФИО Текстовый ФИО Passport Паспорт Текстовый Паспортные данные School Школа Текстовый номер школы Class Класс Текстовый Номер класса ID_test Ид теста Текстовый Ид теста Тест Поле Описание Тип данных Комментарий ID_test Ид теста Текстовый Ид теста Info Информация Текстовый Инф о тесте Test_data Дата проведения Дата Дата проведения Location Место проведения Текстовый Место тестирования Вопрос Поле Описание Тип данных Комментарий ID_question Ид вопроса Текстовый Идентификатор ID_theme Ид темы Текстовый Идентификатор ID_level Ид уровня Текстовый Идентификатор ID_subject Ид предмета Текстовый Идентификатор ID_author Ид автора Текстовый Идентификатор Q_text Текст Текстовый Сам вопрос(текст) Ответ Поле Описание Тип данных Комментарий ID_answer Ид ответа Текстовый Идентификатор Grade Оценка Текстовый Оценка за вопрос Correct Правильность Текстовый Флаг правильности ответа Ответ-Вопрос Поле Описание Тип данных ID_question Ид вопроса Текстовый ID_answer Ид ответа Текстовый Тест-Вопрос Поле Описание Тип данных ID_test Ид теста Текстовый ID_question Ид вопроса Текстовый Предмет Поле Описание Тип данных ID_subj Ид предмета Текстовый Info Данные о предмете Текстовый Автор Поле Описание Тип данных ID_author Ид автора Текстовый Info Данные об авторе Текстовый FIO ФИО автора Текстовый book Данные о книге, из которой был взят вопрос текстовый
Уровень Поле Описание Тип данных Код Ид уровня Текстовый L_text Описание уровня Текстовый Lvl Номер уровня числовой Тема Поле Описание Тип данных Код Ид темы Текстовый S_text Описание темы Текстовый
Описание способовреализации запросов и отчётов
Подсчет кол-ва тестов зазаданный промежуток времени
SELECTCOUNT(ID_test) AS [Kol-vo]
FROM Test
WHEREtest_date between x AND y;
Вывод фамилии с поискомпо ид теста
SELECT FIO
FROM Member
WHEREID_test=test;
Вывод оценок ответов вданном тесте
SELECTAnswer.grade, Test_Question.ID_test, Test_Question.ID_question,Answer.ID_answer
FROM AnswerINNER JOIN (Test_Question INNER JOIN Answer_Question ONTest_Question.ID_question = Answer_Question.ID_question) ON Answer.ID_answer =Answer_Question.ID_answer
WHERE(((Test_Question.ID_test)=[x]) AND((Test_Question.ID_question)=[Answer_Question].[ID_question]) AND((Answer.ID_answer)=[Answer_Question].[ID_answer]) AND((Answer.correct)='yes'));
Поиск участников теста поместу проведения теста
SELECT *
FROM Member
WHEREID_test=ALL
(SELECTID_test FROM Test
WHERElocation=Gorod);
Поиск вопроса по участкутекста вопроса
SELECT *
FROM Question
WHERE Q_textLIKE x+'*';
Вывод всех тестов запромежуток времени
SELECT *
FROM test
WHEREtest_date BETWEEN x AND y;
Подсчет кол-ва тестов запрошедшую неделю
SELECTCount(ID_test) AS [kol-vo testov]
FROM Test
WHEREtest_date BETWEEN NOW()-7 AND NOW();
Вывод даты проведениятеста по ид участника
SELECTtest_date
FROM Test AS TINNER JOIN Member AS M ON T.ID_test=M.ID_test
WHEREM.ID_member=member;
Описание групппользователей ИС, средств управления разделением доступа и функциональныхвозможностей каждой группы
При реализации продуктабыло выделено три группы пользователей
Главный администратор:
-возможностьпросматривать таблицы пользователей и изменять их
-возможностьпросматривать и изменять все таблицы
-возможность выполнятьвсе вопросы
-возможностьпросматривать лог действий
Преподователь:
-возможность просматриватьи изменять таблицы, связанные с предметной областью
-возможность выполнятьвсе запросы
Ученик:
-возможностьпросматривать таблицы Вопрос, Тема, Предмет, Автор без изменения их
-возможность выполнениявсех запросов
Описание интерфейса ИС
Программа быларазработана с использованием одного окна, изменяющего свои размеры взависимости от этапа работы программы.
1.Окно авторизации призапуске программы:
/>
2.Окно программы привходе под записью главного администратора:
/>
Пример окна после выборапункта меню-база данных-таблицы-вопросы
/>
Таблицаредактируется(изменение уже созданной записи и создание новой здесь же)
/>
Жмем «сохранить» исохраняем наши изменения в БД
/>
3, При нажатии на пунктменю «запросы» становиться доступным выбор возможных запросов
/>
Пример окна после выборазапроса
/>
Пример запроса с вводомдвух данных
/>
4.Просмотр лога действий(базыданных-лог)
/>
Описание контрольногопримера
В качестве контрольногопримера рассмотрим выполнение запроса на подсчет кол-ва тестов за определенныйпромежуток времени
1.Входим в систему
/>
2.Выбираем пункт меню«запросы»
/>
3.Выбирем нужный намзапрос
/>
4.Вводим данные инажимаем «ок»
/>
5.Вводим другойпромежуток времени
/>
Сообщения программы, причины, их вызывающие, и реакцияпользователя на сообщения
1.Сообщение о неверномвводе логина или пароля
/>
2.Попытка создания записиглавного администратора
В системе запрещеносоздание дублирующих записей. Запись главного администратора являетсяединственной и не может быть удалена из системы.
Текст программы, с необходимыми комментариями
Реализация входапользователя в систему
private: System::Void Вход_Click(System::Object^sender, System::EventArgs^ e) {
if((textBox1->Text!="") &&(textBox2->Text!=""))
{
String^ connect=«provider=Microsoft.Jet.OLEDB.4.0;»+path_a;
OleDbConnection^ myOleDbConnection = gcnew OleDbConnection(connect);
OleDbCommand^ myOleDbCommand = myOleDbConnection->CreateCommand();
myOleDbCommand->CommandText =
«Select [id],[lvl]»+
«FROM [auth]»+
«WHERE [login]='»+textBox1->Text+"' AND([pass]='"+textBox2->Text+"');";
myOleDbConnection->Open();
OleDbDataReader^ myOleDbDataReader = myOleDbCommand->ExecuteReader();
while(myOleDbDataReader->Read())
{
id=Convert::ToInt32(myOleDbDataReader[0]);
lvl=Convert::ToInt32(myOleDbDataReader[1]);
}
myOleDbDataReader->Close();
myOleDbConnection->Close();
}
else
{
this->label3->Visible=true;
}
if(lvl==0)
{
String^ connectionString2 =«provider=Microsoft.Jet.OLEDB.4.0;»+path_a;
OleDbConnection^ myOleDbConnection2 = gcnewOleDbConnection(connectionString2);
OleDbCommand^ myOleDbCommand2 = myOleDbConnection2->CreateCommand();
myOleDbCommand2->CommandText =
«INSERT INTO [log] „+
“VALUES (»+id+", Now(), 'Вход в систему');";
myOleDbConnection2->Open();
OleDbDataReader^ myOleDbDataReader2 =myOleDbCommand2->ExecuteReader();
myOleDbConnection2->Close();
this->Text = L«Работа с БД»;
this->ClientSize = System::Drawing::Size(500, 220);
this->menuStrip1->Visible=true;
this->textBox1->Visible=false;
this->textBox2->Visible=false;
this->label1->Visible=false;
this->label2->Visible=false;
this->Вход->Visible=false;
this->Выход->Visible=false;
this->dataGridView1->Visible=true;
this->dataGridView1->Location = System::Drawing::Point(12,30);
this->listBox1->Visible=true;
this->listBox1->Location=System::Drawing::Point(300,30);
}
if(lvl==1)
{
String^ connectionString2 =«provider=Microsoft.Jet.OLEDB.4.0;»+path_a;
OleDbConnection^ myOleDbConnection2 = gcnewOleDbConnection(connectionString2);
OleDbCommand^ myOleDbCommand2 = myOleDbConnection2->CreateCommand();
myOleDbCommand2->CommandText =
«INSERT INTO [log] „+
“VALUES (»+id+", Now(), 'Вход в систему');";
myOleDbConnection2->Open();
OleDbDataReader^ myOleDbDataReader2 =myOleDbCommand2->ExecuteReader();
myOleDbConnection2->Close();
this->Text = L«Работа с БД»;
this->ClientSize = System::Drawing::Size(500, 220);
this->menuStrip1->Visible=true;
this->пользователяToolStripMenuItem->Visible=false;
this->участникиToolStripMenuItem->Visible=false;
this->логToolStripMenuItem->Visible=false;
this->textBox1->Visible=false;
this->textBox2->Visible=false;
this->label1->Visible=false;
this->label2->Visible=false;
this->Вход->Visible=false;
this->Выход->Visible=false;
this->dataGridView1->Visible=true;
this->dataGridView1->Location = System::Drawing::Point(12,30);
this->dataGridView1->ReadOnly=false;
this->listBox1->Visible=true;
this->listBox1->Location=System::Drawing::Point(300,30);
this->Сохранить->Enabled=true;
}
if(lvl==2)
{
String^ connectionString2 = «provider=Microsoft.Jet.OLEDB.4.0;»+path_a;
OleDbConnection^ myOleDbConnection2 = gcnewOleDbConnection(connectionString2);
OleDbCommand^ myOleDbCommand2 = myOleDbConnection2->CreateCommand();
myOleDbCommand2->CommandText =
«INSERT INTO [log] „+
“VALUES (»+id+", Now(), 'Вход в систему');";
myOleDbConnection2->Open();
OleDbDataReader^ myOleDbDataReader2 =myOleDbCommand2->ExecuteReader();
myOleDbConnection2->Close();
this->Text = L«Работа с БД»;
this->ClientSize = System::Drawing::Size(500, 220);
this->menuStrip1->Visible=true;
this->пользователяToolStripMenuItem->Visible=false;
this->тестВопросToolStripMenuItem->Visible=false;
this->вопросОтветToolStripMenuItem->Visible=false;
this->ответыToolStripMenuItem->Visible=false;
this->участникиToolStripMenuItem->Visible=false;
this->тестыToolStripMenuItem->Visible=false;
this->логToolStripMenuItem->Visible=false;
this->уровеньToolStripMenuItem->Visible=false;
this->textBox1->Visible=false;
this->textBox2->Visible=false;
this->label1->Visible=false;
this->label2->Visible=false;
this->Вход->Visible=false;
this->Выход->Visible=false;
this->dataGridView1->Visible=true;
this->dataGridView1->Location = System::Drawing::Point(12,30);
this->dataGridView1->ReadOnly=true;
this->listBox1->Visible=true;
this->listBox1->Location=System::Drawing::Point(300,30);
this->Сохранить->Enabled=false;
}
}
Участок кода,реализующий один из запросов
if (flag==7)
{
String^ connect=«provider=Microsoft.Jet.OLEDB.4.0;»+path_d;
OleDbConnection^ myOleDbConnection = gcnew OleDbConnection(connect);
DataSet = gcnew System::Data::DataSet();
DataSet->CaseSensitive = true;
OleDbCommand^ myOleDbCommand = myOleDbConnection->CreateCommand();
myOleDbCommand->CommandText =«SELECT Answer.grade,Test_Question.ID_test, Test_Question.ID_question, Answer.ID_answer FROM AnswerINNER JOIN (Test_Question INNER JOIN Answer_Question ONTest_Question.ID_question = Answer_Question.ID_question) ON Answer.ID_answer =Answer_Question.ID_answer WHERE (((Test_Question.ID_test)='»+this->textBox3->Text+"')AND ((Test_Question.ID_question)=[Answer_Question].[ID_question]) AND((Answer.ID_answer)=[Answer_Question].[ID_answer]) AND((Answer.correct)='yes'));";
myOleDbConnection->Open();
myOleDbDataAdapter = gcnew OleDbDataAdapter();
myOleDbDataAdapter->SelectCommand = myOleDbCommand;
myOleDbDataAdapter->Fill(DataSet,«Test»);
dataGridView1->DataSource = DataSet ;
dataGridView1->DataMember = «Test»;
this->dataGridView1->DataSource =DataSet->Tables[«Test»]->DefaultView;
myOleDbConnection->Close();
table=«Test»;
String^ connectionString2 =«provider=Microsoft.Jet.OLEDB.4.0;»+path_a;
OleDbConnection^ myOleDbConnection2 = gcnewOleDbConnection(connectionString2);
OleDbCommand^ myOleDbCommand2 = myOleDbConnection2->CreateCommand();
myOleDbCommand2->CommandText =
«INSERT INTO [log] „+
“VALUES (»+id+", Now(), 'Вывод оценок теста с указанием id теста');";
myOleDbConnection2->Open();
OleDbDataReader^ myOleDbDataReader2 =myOleDbCommand2->ExecuteReader();
myOleDbConnection2->Close();
}
Так как изменение данныхи создание новой записи происходят средствами компонента datagridview то далее будет показан код,отвечающий за сохранение этих данных (кнопка «сохранить»)
private: System::Void Сохранить_Click(System::Object^ sender, System::EventArgs^ e) {
OleDbCommandBuilder^ myOleDbCommandBuilder=gcnewOleDbCommandBuilder(myOleDbDataAdapter);
myOleDbDataAdapter->Update(DataSet,table);
DataSet->AcceptChanges();
String^ connectionString2 =«provider=Microsoft.Jet.OLEDB.4.0;»+path_a;
OleDbConnection^ myOleDbConnection2 = gcnewOleDbConnection(connectionString2);
OleDbCommand^ myOleDbCommand2 = myOleDbConnection2->CreateCommand();
myOleDbCommand2->CommandText =
«INSERT INTO [log] „+
“VALUES (»+id+", Now(), 'Сохранение изменений');";
myOleDbConnection2->Open();
OleDbDataReader^ myOleDbDataReader2 =myOleDbCommand2->ExecuteReader();
myOleDbConnection2->Close();
}