Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Хоменко КП / ПЗ КП СУБД.docx
Скачиваний:
86
Добавлен:
15.06.2014
Размер:
281.22 Кб
Скачать
    1. Руководство системного администратора

      1. Назначение программы

См. п. 3.1.1.

      1. Условия выполнения программы

См. п. 3.1.2.

      1. Структура программы

Программа состоит из исполняемого файла DatabaseApp.exeи текстового файла со справкой ( руководство пользователя, отображаемое в окне справки).

      1. Настройка программы

Для установки приложения достаточно распаковать архив DatabaseApp.7zв нужную папку. Если не установлен пакетMicrosoft.NETFramework4 и новее или архиватор 7-Zip, их необходимо загрузить с сайтов-прозводителей из сети Интернет. Так же должен быть установленMSSQLServer2008 (рекомендуется MS SQL Server 2012) и новее и запущены его службы.

      1. Проверка программы

Средством проверки служит запуск и работа приложения. Если программа не запустилась, значит либо не были установлен пакет 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;

}

}

}

Соседние файлы в папке Хоменко КП