База данных под управлением клиента C#
ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ МАТЕМАТИКИ, МЕХАНИКИ И КОМПЬЮТЕРНЫХ НАУК
КУРСОВАЯ РАБОТА ПО КУРСУ:
«ПРОЕКТИРОВАНИЕ ИНФОРМАЦИОННЫХ СИСТЕМ»
выполнил студент
4 курса, 3 группы:
Коваль Н.Н.
проверил преподаватель:
Антоненко А.В.
Ростов-на-Дону
2011
- Описание требуемой программы
В данном курсов проекте необходимо было создать базу данных в любой среде и осуществить ее управление при помощи клиента, созданного на языке программирования C#. База данных была написана в программе Microsoft Access.
Microsoft Access - это функционально полная реляционная СУБД. В ней предусмотрены все необходимые вам средства для определения и обработки данных, а также для управления ими при работе с большими объемами информации. Что касается легкости использования, то Microsoft Access совершил здесь настоящий переворот, и многие для создания своих собственных баз данных и приложений обращаются именно к нему.
Система управления базами данных предоставляет вам возможность контролировать задание структуры и описание своих данных, работу с ними и организацию коллективного пользования этой информацией. СУБД также существенно увеличивает возможности и облегчает каталогизацию и ведение больших объемов хранящейся в многочисленных таблицах информации. СУБД включает в себя три основных типа функций: определение (задание структуры и описание) данных, обработка данных и управление данными. Все эти функциональные возможности в полной мере реализованы в Microsoft Access. В практике, как правило, необходимо решать и задачи с использованием электронных таблиц и текстовых процессоров. Например, после подсчета или анализа данных необходимо их представить в виде определенной формы или шаблоны. В итоге пользователю приходится комбинировать программные продукты для получения необходимого результата. В этом смысле все существенно упростят возможности, предоставляемые Microsoft Access.
2.2. Предназначение СУБД Access
СУБД Access предназначена для разработки баз данных реляционного типа для локального их использования на персональных компьютерах и для работы с этими базами.
При проектировании базы данных, в первую очередь, необходимо определить, что именно нужно хранить.
Данная СУБД была выбрана по следующим причинам:
- простота средств реализации,
- легкость освоения инструментарием разработчика (VBA),
- наглядность визуализации информации.
Также «Microsoft
Access» предоставляет большое
- загрузка модулей по требованию;
- оптимизация дерева вызовов;
- использование файлов MDE;
- автоматическая поддержка компилированного состояния;
- использование библиотек Windows API;
- индивидуальная настройка системы;
- эффективное использование индексов;
- встроенный оптимизатор запросов.
Система управления базами данных (СУБД) обычно поддерживает 4 основных типа отношений между таблицами:
- один-к-одному (одной записи в первой таблице соответствует одна запись во второй);
- один-ко-многим (одной записи в первой таблице соответствует много записей во второй);
- много-к-одному (многим записям в первой таблице соответствует одна запись во второй);
- много-ко-многим (одной записи в первой таблице соответствует много запией во второй и одной записи во второй таблице соответствует много записей в первой).
Связь любого из этих типов может быть обязательной, если в данной связи должен участвовать каждый экземпляр сущности, необязательной – если не каждый экземпляр сущности должен участвовать в данной связи. При этом связь может быть обязательной с одной стороны и необязательной с другой стороны.
В СУБД Access процесс
создания реляционной базы данных включает
создание схемы данных. Схема данных
наглядно отображает таблицы и связи
между ними, а также обеспечивает
использование связей при обработке
данных. В схеме данных устанавливаются
параметры обеспечения
Таким образом,
осуществляется неразрывная связь
внемашинного проектирования базы данных
с этапом ее создания с помощью
СУБД. В схеме данных, построенной
по нормализованной модели данных предметной
области, могут быть установлены
одно-однозначные и одно-
Взаимосвязи таблиц
При создании
в Access схемы данных в ней определяются
и запоминаются связи между таблицами.
Это позволяет системе
Одно-многозначные (1:М) или одно-однозначные (1:1) связи. Схема данных прежде всего ориентирована на работу с таблицами, отвечающими требованиям нормализации, между которыми могут быть установлены одно-многозначные (1:М) или одно-однозначные (1:1) связи, для которых может автоматически поддерживаться связная целостность. Поэтому схему данных целесообразно строить в соответствии с информационно-логической моделью.
При построении схемы данных Access автоматически определяет по выбранному полю связи тип отношения между таблицами. Если поле, по которому нужно установить связь, является уникальным ключом как в одной таблице, так и в другой, Access выявляет отношение один-к-одному. Если поле связи является уникальным ключом в одной таблице (главной таблицы связи), а в другой таблице (подчиненной таблице связи) является не ключевым или входит в составной ключ, то есть значения его могут повторяться, Access выявляет отношение один-ко-многим между записями главной таблицы к подчиненной. В этом случае можно задать автоматическое поддержание целостности связей.
Отношение многие-ко-многим. Отношение многие-ко-многим предполагает, что каждой записи в одной таблице соответствует несколько записей в другой. При этом каждая сторона отношения выглядит как отношение один-ко-многим.
Однако если
рассматривать взаимосвязь
Связующая таблица представляет собой промежуточную таблицу, которая служит мостом между двумя таблицами в отношении многие-ко-многим. Ее ключ состоит из ключевых полей этих таблиц, с каждой из которых она связана отношением один-ко-многим. Помимо ключевых полей, связующая таблица должна содержать хотя бы одно поле, которого нет в связываемых таблицах, но которое имеет значение для каждой из них. Таким образом, отношение многие-ко-многим складывается из отношений многие-к-одному и один-ко-многим.
Связи-объединения. Между двумя таблицами может быть установлена связь-объединение по некоторому полю связи. Для связи-объединения может быть выбран один из трех способов объединения записей:
- Способ 1 - объединение только тех записей, в которых связанные поля обеих таблиц совпадают (производится по умолчанию);
- Способ 2 - объединение тех записей, в которых связанные поля обеих таблиц совпадают, а также объединение всех записей из первой таблицы, для которых нет связанных во второй, с пустой записью второй таблицы;
- Способ 3 - объединение тех записей, в которых связанные поля обеих таблиц совпадают, а также объединение всех записей из второй таблицы, для которых нет связанных в первой, с пустой записью первой таблицы.
Такой тип
связи может быть определен, если
связь характеризуется
Связь-объединение обеспечивает объединение записей таблиц, имеющих одинаковые значения в поле связи. Причем производится объединение каждой записи из одной таблицы с каждой записью из другой таблицы при условии равенства значений в поле связи. Кроме того, если выбран второй или третий вариант в результат объединения могут быть добавлены записи из таблицы, для которых нет логически связанных записей в другой таблице. Последние два варианта часто необходимы при решении практических задач. Примером такой задачи может быть формирование записей студентов с результатами успеваемости как в случае полученной оценки по предмету, так и при отсутствии оценки. При отсутствии оценки соответствующее поле будет пустым.
Создание схемы данных
Создание схемы данных начинается в окне Базы данных (Database) с выполнения команды Сервис|Схема данных (Tools|Relationships) или нажатия кнопки Схема данных (Relationships) на панели инструментов базы данных.
Включение таблиц в схему данных. После нажатия кнопки Схема данных (Relationships) открывается окно Добавление таблицы (Show Table) , в котором можно выбрать таблицы и запросы, включаемые в схему данных. Для размещения таблицы в окне Схема данных (Relationships) надо выделить ее в окне Добавление таблицы (Show Table) и нажать кнопку Добавить (Add). Для выделения нескольких таблиц надо, удерживая клавишу , щелкнуть мышью на каждой из этих таблиц. Включив все нужные таблицы в схему данных, нажать кнопку Закрыть (Close).
В результате в окне Схема данных (Relationships) будут представлены все включенные таблицы со списком своих полей. Далее можно приступать к определению связей между ними.
Создание связей между таблицами. При определении связей в схеме данных удобно использовать информационно-логическую модель в каноническом виде, по которой легко определить главную и подчиненную таблицу каждой одно-многозначной связи, поскольку в такой модели главные объекты всегда размещены выше подчиненных. Эти связи являются основными в реляционных базах данных, т. к. одно-однозначные связи используются лишь в редких случаях, когда приходится разделять большое количество полей, определяемых одним и тем же ключом, по разным таблицам, имеющим разный регламент обслуживания.
Устанавливая в окне схемы данных связи типа 1:М между парой таблиц, надо выделить в главной таблице уникальное ключевое поле, по которому устанавливается связь. Далее, при нажатой кнопке мыши, протащить курсор в соответствующее поле подчиненной таблицы.
При создании связи по составному ключу необходимо выделить все поля, входящие в ключ главной таблицы, и перетащить их на одно из полей связи в подчиненной таблице. Для выделения всех полей, входящих в составной уникальный ключ, необходимо отмечать поля при нажатой клавише . После создания связи откроется окно Изменение связей (Edit Relationships). При этом в строке Тип отношения (Relationship Type) автоматически установится тип один-ко-многим (One-To-Many).
При составном ключе связи в окне Изменение связей (Edit Relationships) необходимо для каждого поля ключа в главной таблице ТАБЛИЦА/ЗАПРОС (Table/Query) выбрать соответствующее поле подчиненной таблицы, названной СВЯЗАННАЯ ТАБЛИЦА/ЗАПРОС (Related Table/Query).
Обеспечение целостности данных
При создании схемы данных пользователь включает в неё таблицы и устанавливает связи между ними. Для связей типа 1:1 и 1:М можно задать параметр обеспечения связной целостности данных, а также автоматическое каскадное обновление и удаление связанных записей.
Обеспечение связной целостности данных означает, что Access при корректировке базы данных обеспечивает для связанных таблиц контроль за соблюдением следующих условий:
- В подчиненную таблицу не может быть добавлена запись с несуществующим в главной таблице значением ключа связи;
- В главной таблице нельзя удалить запись, если не удалены связанные с ней записи в подчиненной таблице;
- Изменение значений ключа связи в записи главной таблицы невозможно, если в подчиненной таблице имеются связанные с ней записи.
При попытке
пользователя нарушить эти условия
в операциях добавления и удаления
записей или обновления ключевых
данных в связанных таблицах Access
выводит соответствующее
Установление между двумя таблицами связи типа 1:М или 1:1 и задание для нее параметров целостности данных возможно только при следующих условиях:
- Связываемые поля имеют одинаковый тип данных, причем имена полей могут быть различными;
- Обе таблицы сохраняются в одной базе данных Access;
- Главная таблица связывается с подчиненной по первичному простому или составному ключу (уникальному индексу) главной таблицы.
Access автоматически
отслеживает целостность
Каскадное обновление и удаление связанных записей
Если для выбранной связи обеспечивается поддержание целостности, можно задать режим каскадного обновления связанных полей и режим каскадного удаления связанных записей.
В режиме каскадного обновления связанных полей при изменении значения поля связи в записи главной таблицы, Access автоматически изменит значения в соответствующем поле в подчиненных записях.
В режиме каскадного удаления связанных записей при удалении записи из главной таблицы будут автоматически удаляться все связанные записи в подчиненных таблицах. При удалении записи из главной таблицы выполняется каскадное удаление подчиненных записей на всех уровнях, если этот режим задан на каждом уровне.
При удалении
записей непосредственно в
Язык SQL (аббревиатура Structured Query Language) – это язык структурированных запросов, стандартный язык, предназначенный для создания баз данных, добавления новых и поддержки имеющихся данных, а также извлечения требуемой информации. Язык SQL с самого начала был создан, чтобы работать с данными из тех баз, которые следуют реляционной модели.
Каждому запросу MS Access можно сопоставить эквивалентную инструкцию SQL. В MS Access пользователи, знакомые с языком SQL, могут использовать его для просмотра и изменения запросов в режиме конструктора, определения свойств форм и отчетов, создания специальных запросов (запросы объединения, запросы к серверу и управляющие запросы), создания подчиненных запросов.
При создании каждого запроса MS Access автоматически составляет эквивалентную ему инструкцию SQL. Изменения, внесенные в инструкцию SQL, автоматически отражаются в бланке конструктора.
В простейшей форме эта команда занимается поиском информации в таблице. Она имеет следующий формат:
SELECT field1, field 2, …
FROM Table;
Здесь field1, field 2,… – список столбцов таблицы Table, которые должны быть представлены в результате запроса.
Для получения всей таблицы вместо списка столбцов необходимо поставить символ «*» (звездочка).
Команда SELECT имеет следующие параметры:
A. DISTINCT (получить список без повторений)
Формат: SELECT DISTINCT field1, field2, …
FROM Table;
B. ALL (получить список со всеми повторениями)
Формат: SELECT ALL field1, field2, …
FROM Table;
C. WHERE (извлечь нужные строки)
Формат: SELECT field1, field2, …
FROM Table WHERE predicate;
Здесь predicate – логическое выражение, которое может быть истинно или ложно для каждой записи таблицы.
D. ORDER BY (рассортировать выходные данные)
Формат: SELECT field1, field2, …
FROM Table
ORDER BY field1 DESC;
Это означает, что выходные данные будут рассортированы по столбцу field1 в порядке убывания (порядок возрастания задается по умолчанию или с помощью слова ASC).
E. GROUP BY (группировать выходные данные)
Формат: SELECT field1, field2, …
FROM Table
GROUP BY [field1, field2, …]
ORDER BY field1 DESC;
Группировка – это объединение записей в соответствии со значениями некоторого заданного поля.
Агрегатные функции
Существуют следующие основные агрегатные функции:
- Count – определение численности;
- Sum – определение суммы;
- First/Last – определение первого/последнего значения;
- Min/Max – определение минимума/максимума;
- Avg – определение среднего значения.
Для обозначения связи двух таблиц дополнительно к команде FROM используются атрибуты INNER JOIN и ON.
4. Запрос может
быть создан также только
Выберем в окне базы данных «Запрос», «Создать» через опцию «Конструктор». В диалоговом окне «Добавление таблицы» выберем опцию «Закрыть». В меню Вид выберите Режим SQL. Появится окно «Запрос на выборку». Наберем следующую инструкцию SQL:
Эта инструкция предназначена для получения списков всех предметов и их кодов. Данные для этого запроса берутся из таблицы «Предмет». Результатом выполнения данного запроса будет таблица, состоящая из двух полей (Наименование предмета и Код предмета) и из всех записей таблицы «Предмет».
Результат запроса для получения списков всех предметов и их кодов
Так как в запросе используется только одна таблица, то нет необходимости указывать поле с обозначением таблицы. Очевидно, что запрос выполняется на основании таблицы «Предмет».
ОСНОВНОЙ КОД ПРОГРАММЫ
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb; // <- for database methods
namespace Sklad
{
public partial class Form1 : Form
{
public OleDbConnection database;
DataGridViewButtonColumn editButton;
DataGridViewButtonColumn deleteButton;
int movieIDInt;
#region Form1 constructor
public Form1()
{
InitializeComponent();
// iniciate DB connection
string connectionString = "Provider=Microsoft.Jet.OLEDB.
try
{
database = new OleDbConnection(
database.Open();
//SQL query to list movies
string queryString = "SELECT ID, Title, Publisher, Previewed, Years, Type FROM sklad,skladType WHERE skladtype.typeID = sklad.typeID";
loadDataGrid(queryString);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
#endregion
#region Load dataGrid
public void loadDataGrid(string sqlQueryString) {
OleDbCommand SQLQuery = new OleDbCommand();
DataTable data = null;
dataGridView1.DataSource = null;
SQLQuery.Connection = null;
OleDbDataAdapter dataAdapter = null;
dataGridView1.Columns.Clear(); // <-- clear columns
//----------------------------
SQLQuery.CommandText = sqlQueryString;
SQLQuery.Connection = database;
data = new DataTable();
dataAdapter = new OleDbDataAdapter(SQLQuery);
dataAdapter.Fill(data);
dataGridView1.DataSource = data;
dataGridView1.
dataGridView1.ReadOnly = true;
dataGridView1.Columns[0].
dataGridView1.Columns[1].Width = 340;
dataGridView1.Columns[3].Width = 55;
dataGridView1.Columns[4].Width = 50;
dataGridView1.Columns[5].Width = 80;
// insert edit button into datagridview
editButton = new DataGridViewButtonColumn();
editButton.HeaderText = "Изменить";
editButton.Text = "Изменить";
editButton.
editButton.Width = 80;
dataGridView1.Columns.Add(
// insert delete button to datagridview
deleteButton = new DataGridViewButtonColumn();
deleteButton.HeaderText = "Удалить";
deleteButton.Text = "Удалить";
deleteButton.
deleteButton.Width = 80;
dataGridView1.Columns.Add(
}
#endregion
private void izlazToolStripMenuItem_Click(
{
Close();
}
#region Close database connection
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
database.Close();
}
#endregion
#region refresh button
private void button2_Click(object sender, EventArgs e)
{
textBox4.Clear();
string queryString = "SELECT ID, Title, Publisher, Previewed, Years, Type FROM sklad,skladtype WHERE skladtype.typeID = sklad.typeID";
loadDataGrid(queryString);
}
#endregion
#region Input
private void button6_Click(object sender, EventArgs e)
{
string typeString;
try
{
typeString = comboBox1.SelectedItem.
}
catch (Exception ex) {
MessageBox.Show("Вы должны ввести категорию продукта\nError: " + ex.Message + "");
return;
}
int type = 0;
string name = textBox1.Text.ToString();
string publisher = textBox2.Text.ToString();
string year = textBox3.Text.ToString();
int yr = 0;
if (year != "")
{
yr = CheckYear(year);
}
string previewed;
if (radioButton1.Checked == true)
{
previewed = "Да";
}
else
{
previewed = "Нет";
}
if (yr != 1)
{
if (typeString == "Бытовая химия") type = 1;
if (typeString == "Продовольственные товары") type = 2;
if (typeString == "Бытовая техника") type = 3;
if (typeString == "Одежда") type = 4;
if (typeString == "Хозяйственные товары") type = 5;
if (typeString == "Мебель") type = 6;
if (typeString == "Ткани") type = 7;
if (typeString == "Стеклотовары") type = 8;
if (typeString == "Автокосметика") type = 9;
if (typeString == "Инструменты") type = 10;
if (typeString == "Алкоголь") type = 11;
if (typeString == "Табачные изделия") type = 12;
if (typeString == "Офисная техника") type = 13;
if (typeString == "Растения") type = 14;
string SQLString ="";
if (year == "")
{
SQLString = "INSERT INTO sklad(Title, Publisher, Previewed, typeID) VALUES('" + name.Replace("'", "''") + "','" + publisher + "','" + previewed + "'," + type + ");";
}
else
{
MessageBox.Show(yr.ToString())
SQLString = "INSERT INTO sklad(Title, Publisher, Previewed, Years, typeID) VALUES('" + name.Replace("'", "''") + "','" + publisher + "','" + previewed + "'," + yr + "," + type + ");";
}
OleDbCommand SQLCommand = new OleDbCommand();
SQLCommand.CommandText = SQLString;
SQLCommand.Connection = database;
int response = -1;
try
{
response = SQLCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if (response >= 1) MessageBox.Show("Товар успешно
добавлен","Поздравления",
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
comboBox1.ResetText();
radioButton1.Checked = radioButton2.Checked = false;
}
else
{
MessageBox.Show("Год введен некорректно!\nВведите
год правильно.", "Осторожно",MessageBoxButtons.
textBox3.Clear();
textBox3.Focus();
}
}
public int CheckYear(string year)
{
int yr = int.Parse(year);
if (yr >= 2100 || yr <= 1900)
{
return 1;
}
else
{
return yr;
}
}
#endregion
#region Delete/Edit button handling
private void dataGridView1_
{
string queryString = "SELECT ID, Title, Publisher, Previewed, Years, Type FROM sklad,skladType WHERE skladtype.typeID = sklad.typeID";
int currentRow = int.Parse(e.RowIndex.ToString(
try
{
string movieIDString = dataGridView1[0, currentRow].Value.ToString();
movieIDInt = int.Parse(movieIDString);
}
catch (Exception ex) { }
// edit button
if (dataGridView1.Columns[e.
{
string title = dataGridView1[1, currentRow].Value.ToString();
string publisher = dataGridView1[2, currentRow].Value.ToString();
string previewed = dataGridView1[3, currentRow].Value.ToString();
string year = dataGridView1[4, currentRow].Value.ToString();
string type = dataGridView1[5, currentRow].Value.ToString();
//runs form 2 for editing
Form2 f2 = new Form2();
f2.title = title;
f2.publisher = publisher;
f2.previewed = previewed;
f2.year = year;
f2.type = type;
f2.movieID = movieIDInt;
f2.Show();
dataGridView1.Update();
}
// delete button
else if (dataGridView1.Columns[e.
{
// delete sql query
string queryDeleteString = "DELETE FROM sklad where ID = "+movieIDInt+"";
OleDbCommand sqlDelete = new OleDbCommand();
sqlDelete.CommandText = queryDeleteString;
sqlDelete.Connection = database;
sqlDelete.ExecuteNonQuery();
loadDataGrid(queryString);
}
}
#endregion
private void Form1_Load(object sender, EventArgs e)
{
}
#region search by title
private void button1_Click(object sender, EventArgs e)
{
string title = textBox4.Text.ToString();
if (title != "")
{
string queryString = "SELECT ID, Title, Publisher, Previewed, Years, Type FROM sklad,skladtype WHERE skladtype.typeID = sklad.typeID AND sklad.title LIKE '" + title + "%'";
loadDataGrid(queryString);
}
else
{
MessageBox.Show("Вы должны ввести название
продукта","Осторожно",
}
}
#endregion
#region search by type
private void button5_Click(object sender, EventArgs e)
{
int type = 0;
string typeString = comboBox2.SelectedItem.

- База данных по ИКС
- База данных по информатике
- База данных «Поликлиника»
- База данных по продаже автомобилей
- База данных по продажи сотовых телефонов
- База данных, построенная на основе классов
- База данных по учету успеваемости ВУЗа
- База данных обувного магазина
- База данных о спортсменах и тренерах
- База данных отдела кадров
- База данных отдела кадров
- База данных отдела кадров
- База данных отдела кадров предприятия ОПТТОРГ
- База данных по гарантийным талонам