Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TP_DB.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
295.42 Кб
Скачать

Работа с базами данных в c#

Первый шаг: определиться с классами системы. Необходимо описать три вида классов: сущности, граничные и управляющие классы.

Сущности

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

- Сотрудники (заключают договоры займа)

- Контрагенты(Предоставляют займы)

- Договора займов(хранят информацию об условиях займа)

- Список статей доходов, расходов(хранят информацию о статьях доходов и расходов)

- Журнал проводок(хранит информацию о бухгалтерских операциях системы)

- План счетов(Хранит информацию о бухгалтерских счетах)

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

Управляющие классы

Основное назначение управляющих классов – манипуляция с сущностями и осуществление основных функций системы. Как правило, в основном управляющие классы содержат только методы, выполняющие функции системы. Соответственно, для небольших систем(такой как наша), будет достаточно одного управляющего класса. Определим его методы. Их можно разделить на четыре группы.

Сервисные обязательные методы:

- Установление связи с базой данных

Сервисные необязательные методы(для удобства):

- Формирование структуры таблиц БД при первичной установке системы

- Функция заполнения таблиц первичными(тестовыми данными)

- Функция очистки таблиц БД

- Функция уничтожения таблиц БД

Сервисные специфические методы:

- Установление текущего периода

- Создание архива БД

Методы «по заданию»:

- Изменение информации о конкретном объекте-сущности

- Фиксация операции заключения договора

- Фиксация поступления денежных средств

- Закрытие договора

- Возврат займа

Проектирование бд

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

Установка связи с БД. Есть два варианта реализации: открытие соединения или просто формирование строки подключения. Первый вариант рекомендуется для приложений, которые почти постоянно общаются с БД, не производя с ее информацией длительных расчетов. Тогда соединение с БД рекомендуется открывать только один раз. Если же в ваших приложениях к БД вы обращаетесь редко, то сам коннект к БД рекомендуется осуществлять непосредственно перед выполнением запроса, так как длительно открытое соединение может в будущем создать проблемы: допустим, вы соединились с БД, выдернули оттуда данные и начали их обрабатывать. Эта процедура может занять длительное время и сервер отключит ваше соединение по таймауту неиспользования, затем, когда вы захотите еще раз выдернуть данные из БД, вам все равно придется создавать подключение заново.

Выполнение данной функции состоит из двух этапов: первый этап подготовительный. Состоит в создании самой БД. Откройте Visual Studio. Перейдите в окно Server Explorer(через View).

Найдите DataConnection и, нажав правую кнопку мыши, выберите Add connection.

В открывшемся окне в разделе Data source нажмите Change и выберите Microsoft Sql Server Database File.

В поле Database file name введите полный путь к тому месту, где на вашем компьютере необходимо создать файл БД. Например, чтобы на диске D создать файл с именем MyDB.mdf пишем: D:\MyDB.mdf. Нажимаем ОК. Вам скажут, что такого файла нет, и спросят, хотите ли вы его создать. Нажимаем «Да». Теперь в окне Server Explorer под Data Connection появился новый элемент – имя вашего файла. Правой кнопкой нажимаем на этом соединении и ищем его свойства(Properties). Далее в свойствах ищем ConnectionString. Выделяем, копируем текст этого свойства и временно вставляем его в какой-нибудь текстовый файл, он нам понадобится позже. Строка это будет иметь вид примерно следующий:

Data Source=.\SQLEXPRESS;AttachDbFilename=D:\MyDB.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True

Теперь мы готовы к тому, чтобы начать писать саму программу. Написание программы

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

using System.Data.SqlClient;

Так как ему необходимо подключаться к БД и хранить настройки этого подключения, то ему нужно строковое поле:

class UpravClass

{

string connectionString = "";

}

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

class UpravClass

{

string connectionString = "";

public string ConsStr

{

get { return connectionString; }

set { connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + value + ";Integrated Security=True;Connect Timeout=30;User Instance=True"; }

}

}

В методе set этого свойства мы разбиваем полученную ранее строку подключения, заменяя имя файла ключевым словом value. Теперь пользователю нужно будет только выбрать имя файла, а строка подключения сформируется сама. Теперь определим конструктор для создания объекта этого класса. Ему передадим путь к файлу БД и установим значение этого поля.

class UpravClass

{

string connectionString = "";

public string ConsStr

{

get { return connectionString; }

set { connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + value + ";Integrated Security=True;Connect Timeout=30;User Instance=True"; }

}

public UpravClass(string dbpath)

{

ConsStr = dbpath;

}

}

Существует два варианта работы с БД. Первый через визуальные компоненты Visual Studio, второй через чисто программный код. Мы частично рассмотрим оба метода.

При выполнении различных управляющих функций в БД(создание, очистка, уничтожение таблиц, вставка) мы будем выполнять всегда следующие действия:

- Открывать соединение с БД,

- Выполнять команду

- Возвращать сообщение об успешном выполнении команды или ошибке.

Соответственно, у нашего управляющего класса можно определить метод:

public string ExecSQL(string query)

{

try

{

using (SqlConnection conn = new SqlConnection(ConsStr))

{

conn.Open();

using (SqlCommand c = new SqlCommand(query))

{

c.Connection = conn;

c.ExecuteNonQuery();

}

}

return “Execution completed sucsessful”;

}

catch (Exception exp)

{

return “Excecution error: ”+exp.Message;

}

}

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

Создать таблицы в БД вы можете двумя способами. Первый способ – в редакторе Server Explorer. Открываем там свою БД и ищем папку Tables. Нажимаем правой кнопкой мыши и выбираем Add New Table.

У вас откроется окно-редактор столбцов. ColumnName – имя столбца, DataType – тип данных столбца. Заполняем эти данные. У столбца id с типом int вам необходимо будет поставить автоинкремент. Для этого переходим к окну свойств столбца(в нижней части экрана) и ищем свойство Identity Specification. Ставим Is Identity – Yes. Остальные свойства в категории Identity по 1.

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

Второй вариант создания таблиц, а заодно и заполнение их тестовыми данными – использование SQL-запросов в программном коде. Размещаем на форме кнопку, в ней создаем объект нашего управляющего класса, в конструкторе передав ему имя файла, затем вызываем его метод ExecSQL с запросом на создание таблицы и заполнение ее тестовыми данными. Пример для справочника Sotrudniki:

UpravClass u=new UpravClass(@”D:\MyDB.mdf”);

string query = “CREATE TABLE Sotrudniki (id INT Identity PRIMARY KEY,fio varchar(50));";

u.ExecSQL(query);

for(int i=0;i<10;i++)

{

query ="Insert into sotrudniki(fio)values('Sotrudnik'”+i.toString()+”)";

u.ExecSQL(query);

}

Для очистки таблицы Sotrudniki напишите следующий код:

UpravClass u=new UpravClass(@”D:\MyDB.mdf”);

string query = “truncate TABLE Sotrudniki";

u.ExecSQL(query);

Для удаления таблицы Sotrudniki из БД напишите:

UpravClass u=new UpravClass(@”D:\MyDB.mdf”);

string query = “drop TABLE Sotrudniki";

u.ExecSQL(query);

Обратите внимание, то если вы удалите таблицу из БД, вам ее придется заново создавать, если захотите с ней еще поработать.

Для работы с данными таблиц (просмотр, вставка, удаление и редактирование) мы будем использовать визуальные компоненты работы с БД: DataGridView, DataSet,tableAdapter.

Внимание! Прежде чем переходить к проектированию визуальных компонент, убедитесь, что все таблицы БД у вас созданы! Когда будете помещать их на форму обязательно ставьте модификатор public.

Пусть в нашей БД уже созданы две таблицы Sotrudniki(сотрудники) и Kontr(контрагенты). Разместим на форме два компонента DatagridView и сделаем так, что в одной отобразятся данные первой таблицы, а во второй – другой. Переходим к первой DataGridView и нажимаем на треугольник в белом квадрате в правом верхнем углу компонента. Выбираем Choose Data Sourсe.

Далее, если список доступных data source пуст(а для первой он должен быть пуст), выбираем Add Project Data Sourse -> DataBase->DataSourse. Если в списке подключений есть подключение к БД, то выбираем его, если нет, то выбираем New Connection и создаем подключение, как было описано ранее. Два раза выбираем Next, затем в списке доступных элементов подключения ставим галочку напротив Tables.

Далее у DatagridView в Choose Data Source выбираем Other Data Sources -> Project Data Sources и добираемся до первой таблички.

Во втором DataGridView добираемся тем же путем до второй. После этого у вас должны появиться пять значимых для нас компонента на форме: mydbdataset, kontrBindingSource, sotrudnikiBindingSource,kontrTableAdapter и sotrudnikiTableAdapter. У DataGridView снимите галочки Enabled Additing, Deleting и Editing. Удаление, добавление и редактирование будем делать по-другому.

Сначала рассмотрим удаление. Это самое простое. Пусть у нас будет кнопка, которая будет удалять текущий элемент из справочника Sotrudniki. В ней необходимо прописать следующий код:

sotrudnikiBindingSource.RemoveCurrent();

sotrudnikiBindingSource.EndEdit();

sotrudnikiTableAdapter.Update(this.myDBDataSet.Sotrudniki);

Теперь рассмотрим добавление и редактирование. Для начала подготовительный этап: добавим в проект новую форму и разместим на ней текстовое поле под fio нашего сотрудника и две кнопки. В форме настроим следующие свойства: FormBorderStyle – FixedDialog, ControlBox – false; AcceptButton – первая кнопка, CanselButton – вторая кнопка. У кнопок настроим следующее: у первой кнопки dialogResult – OK, у второй это же свойство в Cancel. У textbox свойство databindings-text ставим в значение поля нашей таблицы. У появившегося элемента sotrudnikiBindingSource ставим Modifier в значение public. Теперь переходим к событиям и в событии FormClosing прописываем следующий код:

if (DialogResult == System.Windows.Forms.DialogResult.OK)

sotrudnikiBindingSource.EndEdit();

else

sotrudnikiBindingSource.CancelEdit();

Теперь в основной форме в кнопке «добавление нового» пишем код:

Form2 f = new Form2();

sotrudnikiBindingSource.AddNew();

f.sotrudnikiBindingSource.DataSource = sotrudnikiBindingSource;

f.sotrudnikiBindingSource.Position = sotrudnikiBindingSource.Position;

if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)

sotrudnikiTableAdapter.Update(this.myDBDataSet.Sotrudniki);

В кнопке «редактирование текущего» пишем код:

Form2 f = new Form2();

f.sotrudnikiBindingSource.DataSource = sotrudnikiBindingSource;

f.sotrudnikiBindingSource.Position = sotrudnikiBindingSource.Position;

if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)

sotrudnikiTableAdapter.Update(this.myDBDataSet.Sotrudniki);

Рассмотрим теперь редактирование связанных элементов. Создадим еще одну табличку БД – договоры(Dogovor). Допустим, что вам при создании нового элемента этого справочника нужно выбирать наименование контрагента и наименование сотрудника. Тоже самое при редактировании: эти поля должны выбираться, а не вводиться. Сразу стоит уточнить, что в итоге вам нужно хранить не ФИО и наименование, а идентификаторы этих записей, соответственно, выбираться должно ФИО, а в базу писаться id. Первое, что вам необходимо сделать – создать в dataset новое представление данных, в которое выгрузить идентификатор и наименование для каждого из связываемых справочников. Начнем с контрагентов. Переходим в окне SolutionExplorer к MyDBDataSet.xsd, правой кнопкой – View Designer. Копируем и вставляем табличку по контрагентам. Нажимаем правой кнопкой на Kontr1TableAdapter, теперь переходим в свойства и выставляем в none InsertCommand и uUpdateCommand. Свойство SelectCommand меняем следующим образом. Во-первых разворачиваем его и заходим в Command, в окне с SQL запросом пишем следующую команду:

SELECT id, CONVERT(varchar, id) + ' ' + Name AS NAME

FROM Kontr

Аналогичное делаем для сотрудников. Теперь на форме для создания или редактирования информации о договоре помещаем два combobox. Опишем на примере контрагентов, что делать дальше. Во-первых, в свойстве Datasource выбираем Kontr1bindingsource, в свойстве DisplaMember выбираем Name, а в свойстве ValueMember берем id. В событии combobox1_selectedIndexChanged пишем следующий код:

if (comboBox1.SelectedValue != null)

{

MyDBDataSet.DogovorRow r = (MyDBDataSet.DogovorRow)((DataRowView)dogovorBindingSource.Current).Row;

r.idkontr = comboBox1.SelectedValue.ToString();

}

Чтоб изменение вступили в силу, как обычно сохраняем:

dogovorBindingSource.EndEdit();

dogovorTableAdapter.Update(myDBDataSet.Kontr);

Теперь рассмотрим решение следующей задачи: пусть при выборе определенного элемента справочника сотрудников нам показываются только те договора, которые он заключил. На форме должно быть размещено два datagridview – одно для сотрудников, другое для договоров. Для datagridview сотрудников(пусть оно будет datagridview1) пишем обработчик события CellClick:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

{

MyDBDataSet.SotrudnikiRow r = (MyDBDataSet.SotrudnikiRow)((DataRowView)sotrudnikiBindingSource.Current).Row;

dogovorBindingSource.Filter = "idsotr = " + r.id.ToString();

}

Если необходимо, чтоб при нажатии на какую-либо кнопку отображались договора всех сотрудников, не зависимо от выбранного, то в ее обработчике прописываем:

dogovorBindingSource.Filter =string.Empty;

Теперь о формировании отчетов. Пусть нам необходимо сформировать список контрагентов, чье наименование содержит введенное пользователем значение. Для начала идем в редактор dataset и у таблички KontrTableAdapter выбираем правой кнопкой Add query. Выбираем Use select statements, далее select with returns rows, далее дополняем имеющийся там запрос строчкой:

WHERE (Name like ’%@Name%’)

В поле MethodName раздела FillDataTable пишем FillByName, во втором разделе – GetDataByName.

С датами и числовыми значениями все согласно синтаксису SQL.

Соответственно, если нужно будет делать несколько разных отчетов, то будет несколько разных методов.

Теперь на форму с отчетом помещаем datagridview, настроенный на таблицу контрагентов, размещаем текстовое поле, в которое пользователь будет вводить данные. По кнопке пишем код:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]