База данных под управлением клиента C#

ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ  УНИВЕРСИТЕТ

ФАКУЛЬТЕТ МАТЕМАТИКИ, МЕХАНИКИ И  КОМПЬЮТЕРНЫХ НАУК

 

 

 

 

 

 

КУРСОВАЯ РАБОТА ПО КУРСУ:

«ПРОЕКТИРОВАНИЕ ИНФОРМАЦИОННЫХ СИСТЕМ»

 

 

 

 

 

выполнил студент

4 курса,  3 группы:

Коваль  Н.Н.

проверил  преподаватель:

Антоненко  А.В.

 

 

 

 

Ростов-на-Дону

2011

    1. Описание  требуемой программы

В  данном курсов проекте  необходимо было создать базу данных в любой  среде и осуществить ее управление при помощи клиента, созданного на языке  программирования 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 - объединение тех записей, в которых связанные поля обеих таблиц совпадают, а также объединение всех записей из второй таблицы, для которых нет связанных в первой, с пустой записью первой таблицы.

Такой тип  связи может быть определен, если связь характеризуется отношением 1:1 или 1:М, а также если тип отношения  не может быть определен системой, то есть если не выполняются условия  для этих отношений. Например, при  выборе в главной таблице в  качестве поля связи неключевого  поля или поля, входящего в составной  ключ, Access сообщает, что тип отношения  не может быть определен. В этом случае между таблицами возможно установление только связи-объединения.

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

Создание схемы данных

Создание  схемы данных начинается в окне Базы данных (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 не позволяет установить параметр целостности для связи таблиц, если ранее введенные в таблицы данные не отвечают требованиям целостности.

Каскадное обновление и удаление связанных  записей

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

В режиме каскадного обновления связанных полей при изменении значения поля связи в записи главной таблицы, 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. Появится окно «Запрос на выборку». Наберем следующую инструкцию 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.4.0;Data Source=skladdb.mdb";

            try

            {

 

                database = new OleDbConnection(connectionString);

                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.AllowUserToAddRows = false; // remove the null line

            dataGridView1.ReadOnly = true;

            dataGridView1.Columns[0].Visible = false;

            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.UseColumnTextForButtonValue = true;

            editButton.Width = 80;

            dataGridView1.Columns.Add(editButton);

            // insert delete button to datagridview

            deleteButton = new DataGridViewButtonColumn();

            deleteButton.HeaderText = "Удалить";

            deleteButton.Text = "Удалить";

            deleteButton.UseColumnTextForButtonValue = true;

            deleteButton.Width = 80;

            dataGridView1.Columns.Add(deleteButton);

        }

        #endregion

 

        private void izlazToolStripMenuItem_Click(object sender, EventArgs e)

        {

            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.ToString();

            }

            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("Товар успешно добавлен","Поздравления",MessageBoxButtons.OK, MessageBoxIcon.Information);

                textBox1.Clear();

                textBox2.Clear();

                textBox3.Clear();

                comboBox1.ResetText();

                radioButton1.Checked = radioButton2.Checked = false;

            }

            else

            {

                MessageBox.Show("Год введен некорректно!\nВведите год правильно.", "Осторожно",MessageBoxButtons.OK, MessageBoxIcon.Warning);

                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_CellContentClick(object sender, DataGridViewCellEventArgs e)

        {

 

            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.ColumnIndex] == editButton && currentRow >= 0)

            {

                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.ColumnIndex] == deleteButton && currentRow >= 0)

            {

                // 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("Вы должны ввести название продукта","Осторожно",MessageBoxButtons.OK,MessageBoxIcon.Warning);

            }

        }

        #endregion

 

        #region search by type

        private void button5_Click(object sender, EventArgs e)

        {

            int type = 0;

            string typeString = comboBox2.SelectedItem.ToString();

База данных под управлением клиента C#