
- •Реферат
- •Введение
- •Описание разработанной базы данных
- •Постановка задания
- •Проектирование базы данных
- •Особенности реализации вMs sql
- •Разработка приложения
- •Анализ и методы решения задачи
- •Разработка алгоритма
- •Разработка пользовательского интерфейса
- •Написание кода
- •Тестирование и отладка приложения
- •Программная документация
- •Руководство пользователя
- •Руководство системного администратора
- •Заключение
- •Список использованных источников
- •Код программы
Руководство системного администратора
Назначение программы
См. п. 3.1.1.
Условия выполнения программы
См. п. 3.1.2.
Структура программы
Программа состоит из исполняемого файла DatabaseApp.exeи текстового файла со справкой ( руководство пользователя, отображаемое в окне справки).
Настройка программы
Для установки приложения достаточно распаковать архив DatabaseApp.7zв нужную папку. Если не установлен пакетMicrosoft.NETFramework4 и новее или архиватор 7-Zip, их необходимо загрузить с сайтов-прозводителей из сети Интернет. Так же должен быть установленMSSQLServer2008 (рекомендуется MS SQL Server 2012) и новее и запущены его службы.
Проверка программы
Средством проверки служит запуск и работа приложения. Если программа не запустилась, значит либо не были установлен пакет Microsoft .NET Framework, либо приложение распаковалось с ошибками.
Заключение
В результате выполнения данной курсовой работы был получен опыт в проектировании, создании и заполнении базы данных и возможностях языка C# для работы с БД. Так же было создано приложение, позволяющее работать с базами данных под управлением СУБДMSSQLServer, а так же изменять данные в них. Приложение отвечает всем поставленным требованиям.
Список использованных источников
1 Работа с СУБД MySQL: учеб. пособие / О. Б. Малков, М. В. Девятерикова. – Омск: Изд-во ОмГТУ, 2010. – 84 с.
2 Цыганенко В. Н.. Технология программирования: методические указания к курсовому проектированию. - Омск: Изд-во ОмГТУ, 2005. - 44 с.
3 Шилдт Герберт. Полный справочник по С#: Пер. с англ. – М.: Издательский дом «Вильямс», 2004. – 752 с.: ил.
Приложение А
(обязательное)
Код программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
namespace OfficeExpenseApp
{
public partial class main : Form
{
//Переменные
public static string connectionPath = "";//Для хранения пути подключения с атрибутами
TextBox msg;//Для вывода сист. сообщений
List<DataGridView> DataGrid = new List<DataGridView>();
SqlConnection connectionDB = new SqlConnection();
DataTable tableFK = new DataTable();//Хранит инф-ю о всех внешних ключах
bool newRow = false;//Если в DataGrid была создана новая строка
int RowCurrentCell, ColumnCurrentCell;
string oldPrimaryKey = "";
string oldValueCurrentCell = "";
public main()
{
InitializeComponent();
}
//Подключение к БД и загрузка в DataGrid
private bool loadDataBase()
{
tabControl.TabPages.Clear();
try
{
connectionDB.ConnectionString = connectionPath;
connectionDB.Open();
/*загрузка списка таблиц*/
SqlCommand command = new SqlCommand("SELECT * FROM sys.objects WHERE type in (N'U')", connectionDB);
SqlDataReader reader = command.ExecuteReader();
DataGrid.Clear();
while (reader.Read())
{
var tp = new TabPage(String.Format("{0}", reader[0]));
var dgv = new DataGridView();
dgv.Anchor = (AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom);
dgv.MultiSelect = false;
dgv.AllowUserToResizeRows = false;
//Перенаправление обработки событий dvg
dgv.CellBeginEdit += new System.Windows.Forms.DataGridViewCellCancelEventHandler(SaveValue);
dgv.UserDeletingRow += new System.Windows.Forms.DataGridViewRowCancelEventHandler(DeleteData);
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dgv.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(IncorrectData);
dgv.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(UpdateData);
dgv.Size = new Size(200, 100);
dgv.ScrollBars = ScrollBars.Both;
dgv.Name = String.Format("{0}", reader[0]);
this.DataGrid.Add(dgv);
tp.Controls.Add(dgv);
tp.Name = tp.Text;
tabControl.Controls.Add(tp);
}
reader.Close();
QueryTab();
MessageTab();
setMessageTab(0, "");
connectionDB.Close();
UpdateTables();
setMessageTab(1, "");
return true;
}
catch
{
connectionDB.Close();
groupBox2.Enabled = false;
setMessageTab(2, "");
return false;
}
}
//Вкладка "Запрос"
private void QueryTab()
{
var tp1 = new TabPage("[Запрос SQL]");
var dgv1 = new DataGridView();
dgv1.Anchor = (AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom);
dgv1.AllowUserToAddRows = false;
dgv1.AllowUserToDeleteRows = false;
dgv1.AllowUserToResizeRows = false;
dgv1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dgv1.ReadOnly = true;
dgv1.Size = new Size(200, 100);
dgv1.ScrollBars = ScrollBars.Both;
this.DataGrid.Add(dgv1);
tp1.Controls.Add(dgv1);
tp1.Name = "QUERYTAB";
tabControl.Controls.Add(tp1);
}
//Вкладка "Сообщения"
private void MessageTab()
{
var tp2 = new TabPage("[Системные Сообщения]");
msg = new TextBox();
msg.ReadOnly = true;
msg.Multiline = true;
msg.ScrollBars = ScrollBars.Vertical;
msg.Size = new Size(200, 100);
msg.ForeColor = System.Drawing.Color.Red;
msg.Anchor = (AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom);
tp2.Controls.Add(msg);
tp2.Name = "MSGTAB";
tabControl.Controls.Add(tp2);
}
//Типы сообщений
private void setMessageTab(int nummsg, string attachment)
{
string message = "";
switch (nummsg)
{
case 0: message = "\r\n[" + DateTime.Now + "] Подключение... "; break;
case 1: message = "\r\n[" + DateTime.Now + "] Подключение установлено. "; break;
case 2: message = "\r\n[" + DateTime.Now + "] Ошибка. Соединение с БД не установлено. "; break;
case 3: message = "\r\n[" + DateTime.Now + "] Запрос успешно выполнен. "; break;
case 4: message = "\r\n[" + DateTime.Now + "] Ошибка запроса. "; break;
case 5: message = "\r\n[" + DateTime.Now + "] Ошибка обновления/считывания записи. "; break;
case 6: message = "\r\n[" + DateTime.Now + "] Запись успешно обновлена. "; break;
case 7: message = "\r\n[" + DateTime.Now + "] Запись успешно удалена. "; break;
case 8: message = "\r\n[" + DateTime.Now + "] Ошибка удаления записи. "; break;
case 9: message = "\r\n[" + DateTime.Now + "] Запись успешно добавлена. "; break;
case 10: message = "\r\n[" + DateTime.Now + "] Ошибка при добавлении записи. "; break;
}
msg.Text += message + attachment;
}
//Cохранить значение первичного ключа до редактирования
private void SaveValue(object sender, DataGridViewCellCancelEventArgs e)
{
RowCurrentCell = DataGrid[tabControl.SelectedIndex].CurrentCell.RowIndex;
ColumnCurrentCell = DataGrid[tabControl.SelectedIndex].CurrentCell.ColumnIndex;
oldPrimaryKey = DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.Cells[0].Value.ToString();
oldValueCurrentCell = DataGrid[tabControl.SelectedIndex].CurrentCell.Value.ToString();
//Проверка на новую строку в DataGrid.
if (DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.IsNewRow) newRow = true;
}
//Обработчик ошибочных данных
private void IncorrectData(object sender, DataGridViewDataErrorEventArgs e)
{
if (tabControl.SelectedTab.Name != "sysdiagrams")
{
setMessageTab(5, "Невозможно прочесть данные. " + e);
MessageBox.Show("Невозможно прочесть данные. Введите корректное значение.", "Ошибка обновления/считывания записи.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
//Удаление строки
private void DeleteData(object sender, DataGridViewRowCancelEventArgs e)
{
try
{
connectionDB.Open();
SqlCommand command = new SqlCommand(
"DELETE FROM " + tabControl.SelectedTab.Name
+ " WHERE "
+ DataGrid[tabControl.SelectedIndex].Columns[0].Name
+"='"
+ DataGrid[tabControl.SelectedIndex].CurrentRow.Cells[0].Value.ToString()
+"'"
, connectionDB);
command.ExecuteNonQuery();
connectionDB.Close();
setMessageTab(7, "");
}
catch(Exception ex)
{
connectionDB.Close();
setMessageTab(8, ex.ToString());
}
}
//Обновление строки
private void UpdateData(object sender, DataGridViewCellEventArgs e)
{
if (newRow) InsertData();//Если в DataGrid новая строка
if (DataGrid[tabControl.SelectedIndex].CurrentCell.Value.ToString().Replace(" ", "") == "")
{
setMessageTab(5, "Нельзя оставить поле пустым! Было возвращено предыдущее значение. ");
DataGrid[tabControl.SelectedIndex].CellValueChanged -= UpdateData;
DataGrid[tabControl.SelectedIndex].Rows[RowCurrentCell].Cells[ColumnCurrentCell].Value = oldValueCurrentCell;
DataGrid[tabControl.SelectedIndex].CellValueChanged += UpdateData;
return;
}
try//Обновление строки
{
connectionDB.Open();
SqlCommand command = new SqlCommand(
"UPDATE "+tabControl.SelectedTab.Name + " SET " +
DataGrid[tabControl.SelectedIndex].CurrentCell.OwningColumn.Name + "='"
+ DataGrid[tabControl.SelectedIndex].CurrentCell.Value.ToString() + "' WHERE "
+ DataGrid[tabControl.SelectedIndex].Columns[0].Name + "='"
+ oldPrimaryKey
+ "'", connectionDB);
command.ExecuteNonQuery();
connectionDB.Close();
UpdateTables();
setMessageTab(6, "");
}
catch(Exception ex)
{
connectionDB.Close();
setMessageTab(5, Convert.ToString(ex));
UpdateTables();
}
}
//Новая строка в DataGrid
private void InsertData()
{
try
{
getForeignKeys();
string commandString = "INSERT INTO " + tabControl.SelectedTab.Name + " VALUES('";
string firstСolumn = "";
connectionDB.Open();
if (DataGrid[tabControl.SelectedIndex].CurrentCell.OwningColumn.Index == 0)//Если записали значение в первую колонку DataGrid
{
commandString += DataGrid[tabControl.SelectedIndex].CurrentCell.Value.ToString();
setMessageTab(3, "");
}
else
{
SqlCommand command = new SqlCommand(
"SELECT MAX(" + DataGrid[tabControl.SelectedIndex].Columns[0].Name + ") FROM " + tabControl.SelectedTab.Name, connectionDB);
string maxfirstColiumn = Convert.ToString(command.ExecuteScalar());
try//Первая колонка имеет тип String
{
Convert.ChangeType("*", DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.Cells[0].ValueType);
firstСolumn = maxfirstColiumn + "*";
}
catch//Первая колонка имеет числовой тип
{
Convert.ChangeType("0", DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.Cells[0].ValueType);
int i;
maxfirstColiumn.Replace(" ", "");
if (maxfirstColiumn == "")
i = 0;
else
i = int.Parse(maxfirstColiumn);
i++;
firstСolumn = i.ToString();
}
}
commandString += firstСolumn + "'";//Добавили значение первой колонки
//Автозаполнение
DataRow[] foundRows;
foundRows = tableFK.Select("childTable='" + tabControl.SelectedTab.Name + "'");
bool next_iteration = false;
for (int i = 1; i < DataGrid[tabControl.SelectedIndex].ColumnCount; i++)
if (i != DataGrid[tabControl.SelectedIndex].CurrentCell.OwningColumn.Index)
{
foreach (DataRow dr in foundRows)
{
if (dr.ItemArray[2].ToString() == DataGrid[tabControl.SelectedIndex].Columns[i].Name.ToString())
{
SqlCommand command = new SqlCommand(
"SELECT MIN("
+ DataGrid[tabControl.SelectedIndex].Columns[i].Name + ") FROM "
+ dr.ItemArray[0].ToString(), connectionDB);
string min_value = Convert.ToString(command.ExecuteScalar());
if (min_value.Replace(" ", "") != "") { commandString += ",'" + min_value + "'"; next_iteration = true; }
else
{
connectionDB.Close();
setMessageTab(10, "Минимальный первичный ключ в таблице " + dr.ItemArray[0].ToString() + " пуст");
return;
}
break;
}
}
if (next_iteration) { next_iteration = false; continue; }
try
{
Convert.ChangeType("-", DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.Cells[i].ValueType);
commandString += ",'-'";
}
catch
{
try
{
Convert.ChangeType("0", DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.Cells[i].ValueType);
commandString += ",'0'";
}
catch
{
try
{
Convert.ChangeType("true", DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.Cells[i].ValueType);
commandString += ",'true'";
}
catch
{
Convert.ChangeType(DateTime.Now, DataGrid[tabControl.SelectedIndex].CurrentCell.OwningRow.Cells[i].ValueType);
commandString += ",'" + DateTime.Now.ToString() + "'";
}
}
}
}
else
commandString += ",'" + DataGrid[tabControl.SelectedIndex].CurrentCell.Value.ToString() + "'";
commandString += ")";
SqlCommand command1 = new SqlCommand(commandString, connectionDB);
command1.ExecuteNonQuery();
connectionDB.Close();
UpdateTables();
newRow = false;
setMessageTab(9, "");
return;
}
catch (Exception ex)
{
connectionDB.Close();
setMessageTab(10, ex.ToString());
UpdateTables();
return;
}
}
//Обновление таблиц
private void UpdateTables()
{
connectionDB.Open();
for (int i = 0; i < tabControl.TabCount - 2; i++)
{
string buf = "SELECT * FROM " + tabControl.TabPages[i].Name;
SqlCommand command = new SqlCommand(buf, connectionDB);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);
BindingSource bs = new BindingSource();
bs.DataSource = table;
DataGrid[i].DataSource = bs;
}
connectionDB.Close();
}
//Получить внешние ключи
private void getForeignKeys()
{
tableFK.Clear();
connectionDB.Open();
for (int i = 0; i < tabControl.TabCount - 2; i++)
{
SqlCommand command = new SqlCommand(
"SELECT o.name[parent], o2.name[childTable],sc.name,sc1.name FROM sys.sysobjects o INNER JOIN sys.sysforeignkeys fk ON fk.rkeyid = o.id INNER JOIN sys.sysobjects"
+
" o2 ON o2.id = fk.fkeyid AND o2.id <> o.id INNER JOIN sys.columns SC on SC.object_id = fk.fkeyid and sc.column_id = fk.fkey INNER JOIN sys.columns SC1 on SC1.object_id"
+
"= fk.rkeyid and sc1.column_id = fk.rkey WHERE o.name = '" + tabControl.TabPages[i].Name+"'"
, connectionDB);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
adapter.Fill(tableFK);
adapter.Dispose();
}
connectionDB.Close();
}
//Выполнить запрос
private void RunQueryClick(object sender, EventArgs e)
{
try
{
//Проверка пробелов в запросе
if (QueryBox.Text.Replace(" ", "") == "")
{
setMessageTab(4, "Был отправлен пустой запрос.");
return;
}
connectionDB.Open();
SqlCommand command = new SqlCommand(QueryBox.Text, connectionDB);
if (command.ExecuteNonQuery() == -1)
{
tabControl.SelectedIndex = tabControl.TabCount - 2;
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);
BindingSource bs = new BindingSource();
bs.DataSource = table;
DataGrid[DataGrid.Count - 1].DataSource = bs;
adapter.Dispose();
setMessageTab(3, "");
}
else setMessageTab(3, "Отсутствуют данные для отображения");
connectionDB.Close();
UpdateTables();
}
catch (Exception ex)
{
connectionDB.Close();
setMessageTab(4, Convert.ToString(ex));
}
}
// =
private void RunQueryEnterKey(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) RunQuery.PerformClick();
}
// =
private void RunQueryMenuItem_Click(object sender, EventArgs e)
{
RunQuery.PerformClick();
}
//Очистить поле ввода
private void ClearQueryBox_Click(object sender, EventArgs e)
{
QueryBox.Clear();
}
// =
private void ClearQueryMenuItem_Click(object sender, EventArgs e)
{
QueryBox.Clear();
}
//Очистить вкладку "Системные сообщения"
private void ClearMessageTabMenuItem_Click(object sender, EventArgs e)
{
if (connectionPath != "")
msg.Clear();
}
//Открыть "О программе"
private void AboutToolStripMenuItem_Click(object sender, EventArgs e)
{
About a = new About();
a.ShowDialog();
a.Dispose();
}
//Открыть "Справку"
private void HelpToolStripMenuItem_Click(object sender, EventArgs e)
{
Help h = new Help();
h.ShowDialog();
h.Dispose();
}
//Диалог открытия БД
private void OpenDBToolStripMenuItem_Click(object sender, EventArgs e)
{
connectionDB.Close();
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "*.mdf|*.mdf";
openFileDialog1.Title = "Выберите MS Database File";
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
connectionPath = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + openFileDialog1.FileName + ";Timeout=10;Integrated Security=True;User Instance=True";
loadDataBase();
}
}
//Кнопка выхода
private void exitItemClick(object sender, EventArgs e)
{
main.ActiveForm.Close();
}
//Загрузка моей БД по умолчанию
private void Main(object sender, EventArgs e)
{
connectionPath = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + @"d:\Universitet\СУБД\КП\Хоменко КП\OfficeExpenseApp\bin\Debug\MyBD_PastoriXx.mdf" +
";Timeout=10;Integrated Security=True;User Instance=True";
loadDataBase();
tabControl.SelectedIndex = tabControl.TabCount - 1;
}
}
}