» » Приложения для работы с базой данных

Приложения для работы с базой данных

Разработка клиентского приложения для работа с базой данных в Turbo Delphi

Разработка клиентского приложения
для работа с базой данных в TurboDelphi.

Пример БД


Дальнейшее изложение теории и все
примеры, будут основаны на БД
«Экзаменационная ведомость», схема
которого рассмотрена ниже


База сгенерирована и заполнена. Сохранена
в файл d:\db\stud.fdb

Создание проекта.


Откройте TurboDelphiи создайте новый проект


Сохраните проект нажав
и указав имя вашего приложения. Так же
укажите имя первого модуля вашего
проекта (по умолчаниюUnit1.pas).
В нашем случаеStudVed.dprиMainUnit.pas.Сохранение обязательно производить
в отдельную папку.


Главную форму назовем MainForm.


Для размещения компонентов по подключения
к базе данных создадим модуль с данными
(Data Module). Для этого перейдитеFile>New>Other…
далее перейти вDelphiFilesи выбратьDataModule.


И сохраним его в файл DataMod.pas.

Механизм доступа к данным


Базовый механизм доступа к данным
создается триадой компонентов:

  • компоненты,
    инкапсулирующие набор данных(потомки классаTDataSet);

  • компоненты
    TDataSource;

  • визуальные
    компоненты отображения данных.

компоненты,
инкапсулирующие набор данных(потомки классаTDataSet);

компоненты
TDataSource;

визуальные
компоненты отображения данных.


Рассмотрим схему взаимодействия этих
компонентов в приложении данных


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


С каждым компонентом доступа к данным
может быть связан как минимум один
компонент TDataSource. В его
обязанности входит соединение набора
данных с визуальными компонентами
отображения данных. КомпонентTDataSourceобеспечивает передачу в эти компоненты
текущих значений по­лей из набора
данных и возврат в него сделанных
изменений.


Еще одна функция компонента TDataSourceзаключается в синхронизации поведения
компонентов отображения данных с
состоянием набора данных. Например,
если набор данных не активен, то компонентTDataSourceобес­печивает
удаление данных из компонентов отображения
данных и их пере­вод в неактивное
состояние. Или, если набор данных работает
в режиме "только для чтения", то
компонентTDataSourceобязан
передать в компонен­ты отображения
данных запрещение на изменение данных.


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


При открытии набора данных компонент
обеспечивает передачу в' набор данных
записей из требуемой таблицы БД. Курсор
набора данных устанав­ливается на
первую запись. Компонент TDataSourceорганизует передачу в компоненты
отображения данных значений необходимых
полей из текущей записи. При перемещении
по записям набора данных текущие значения
полей в компонентах отображения данных
автоматически обновляются.


Пользователь при помощи компонентов
отображения данных может про­сматривать
и редактировать данные. Измененные
значения сразу же пере­даются из
элемента управления в набор данных при
помощи компонента TDataSource.
Затем изменения могут быть переданы в
базу данных или от­менены.

Подключение набора данных

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

Вот собственно и поэтому придумали автономные программы, с помощью которых можно легко подключиться к любому серверу и начать работать с базой данных, не ожидая при этом когда загрузится интерфейс веб-приложения. Ну а кого все устраивает, то рекомендую их изучить хотя бы для общего понимания и представления, что есть другие программы для работы с базой данных, кроме MS Access конечно.

MySQL Administrator — программа для работы и управления базами данных

image

Что делает Navicat популярным?

  • наличие визуального конструктора запросов;
  • возможность импорта, экспорта и резервного копирования данных;
  • возможность создавать отчеты;
  • SSH и HTTP туннелинг;
  • миграция и синхронизация данных и структуры;
  • инструмент для планирования задач и другие возможности.

3. PHPMyAdmin

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

Скачать PHPMyAdmin можно здесь www.phpmyadmin.net/home_page

Стоимость — бесплатно.

image

  • Создание приложения Windows.

  • Создание и настройка набора данных, основой которого являются таблицы Customers и Orders базы данных Northwind, с помощью мастера мастер настройки источника данных.

  • Добавление элементов управления для отображения данных из таблицы Customers.

  • Добавление элементов управления для отображения заказов в зависимости от выбранного клиента.

  • Тестирование приложения путем выбора различных клиентов и проверки верности отображаемых заказов для выбранного клиента.

  • Изменение данных и сохранение их в базе данных.

Создание приложения Windows.

Для образца ресторанного приложения мы создали базу данных SQLite автономно, используя API программирования python для SQLite. Существуют и клиенты с графическим пользовательским интерфейсом, позволяющие вручную добавлять данные в базы данных SQLite и редактировать эти данные. Согласно рекомендации в документации к API Android SQLite, мы добавили столбец «_id» для уникальной идентификации каждой строки. Это будет полезно при реализации абстракций поставщика содержимого и адаптера.

Для доступа к базе данных SQLite из папки assets приложения с помощью интерфейсов API Android SQLite требуется скопировать файл базы данных из папки assets в папку, соответствующую пути к базе данных приложения. Ситуация дополнительно усложняется, если нужно реализовать поддержку обновления базы данных и управления версиями.

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

Мы создали папку databases внутри папки assets и скопировали заранее заполненный файл restaurant.sqlite в папку databases. Подробные сведения см. в следующем фрагменте кода.


  • У каждого сохраняемого
    класса в базе данных есть своя таблица.

  • Поля объектов
    с простыми типами данных (целые, символы, строки и т. д.) сопоставлены
    колонкам в соответствующей таблице базы данных.

  • Каждая строка
    таблицы базы данных cоответствует экземпляру соответствующего хранимого
    класса.

  • Каждая связь
    между объектами типа «многие-ко-многим» требует таблицы-связки,
    так же как это требуется для объектов базы данных типа «многие-ко-многим».
  • Наследование
    моделируется с помощью отношения «один-к-одному» между таблицами,
    соответствующими классу и подклассу.


Вспомните
адресную книгу, о которой мы говорили ранее. Допустим, она имеет таблицы address
и person, как на рис. 8-2.


Модель данных простого приложения адресной книгиРис. 8-2.

Dep

Proisv

Бухгалтерия

управление

Цех 1

производство

Цех 2

производство

В связанных таблицах обычно одна выступает как главная,
а другая или несколько других - как вспомогательные, управляемые главной. Главная
и вспомогательные таблицы связываются друг с другом ключом. В качестве
ключа могут выступать какие-то поля, присутствующие в обеих таблицах.

В примере головной может быть таблица Dep,
вспомогательной Pers, а связываться они могут
по полю Dep, присутствующему в обеих таблицах.

Каждой записи в главной таблице Dep
соответствуют те записи вспомогательной таблицы Pers,
в которых ключевое поле Dep с названием отдела совпадает с названием отдела в текущей
записи главной таблицы. Иначе говоря, если в текущей записи главной таблицы
в поле Dep написано «Бухгалтерия», то во вспомогательной
таблице Pers выделяются все записи сотрудников бухгалтерии.

Создают базы данных и обрабатывают запросы к ним
системы управления базами данных – СУБД: Paradox, Microsoft Access, FoxPro, Oracle, InterBase и т.д.

Разные СУБД по разному организуют и хранят базы
данных. Paradox использует для каждой таблицы один файл.
В Microsoft Access и InterBase несколько таблиц хранятся как один файл. В этом случае
база данных – это имя файла с путем доступа к нему. Системы типа клиент/сервер
(Sybase, Microsoft SQl, Oracle) хранят все данные на отдельном компьютере и общаются
с клиентом посредством специального языка – SQL.

{.Close();_Click(sender, e);

}

}

void findDepo_Click(object sender, EventArgs e)

{(rbDepoNumber.Checked)

{

депоBindingSource.Position =

депоBindingSource.Find("Депо", searchDepoTextBox.Text);

}(rbDepoCapacity.Checked)

{

депоBindingSource.Position =

депоBindingSource.Find("Вместимость", searchDepoTextBox.Text);

}

}

//Редактирование таблицы Закреплениеvoid refreshZakrep_Click(object sender, EventArgs e)

{.закреплениеTableAdapter.Fill(this.auto_Pred_DBDataSet.Закрепление);

}

void addZakrep_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();

com = con.CreateCommand();.CommandText = "EXECUTE @beda =SPaddZakrep @Автомобиль,@Водитель,@Техосмотр, @Статус ";.Parameters.Add("@beda", SqlDbType.Int);.Parameters["@beda"].Direction = ParameterDirection.Output;

{.Parameters.Add("@Автомобиль", SqlDbType.Int).Value = Convert.ToInt32(addZakrepCarTextBox.Text);.Parameters.Add("@Водитель", SqlDbType.Int).Value = Convert.ToInt32(addZakrepDriverTextBox.Text);.Parameters.Add("@Техосмотр", SqlDbType.VarChar).Value = addZakrepTOTextBox.Text;.Parameters.Add("@Статус", SqlDbType.VarChar).Value = addZakrepStatusTextBox.Text;.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void delZakrep_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();com = con.CreateCommand();.CommandText = "EXECUTE SPdelZakrep @Марка,@ФИО";

{.Parameters.Add("@Марка", SqlDbType.VarChar).Value = delZakrepMarkaTextBox.Text;.Parameters.Add("@ФИО", SqlDbType.VarChar).Value = delZakrepFIOTextBox.Text;.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void changeZakrep_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();

com = con.CreateCommand();.CommandText = "EXECUTE @beda =SPchangeZakrep @Автомобиль,@Водитель,@Техосмотр, @Статус ";.Parameters.Add("@beda", SqlDbType.Int);.Parameters["@beda"].Direction = ParameterDirection.Output;

{.Parameters.Add("@Автомобиль", SqlDbType.Int).Value = Convert.ToInt32(addZakrepCarTextBox.Text);.Parameters.Add("@Водитель", SqlDbType.Int).Value = Convert.ToInt32(addZakrepDriverTextBox.Text);.Parameters.Add("@Техосмотр", SqlDbType.VarChar).Value = addZakrepTOTextBox.Text;.Parameters.Add("@Статус", SqlDbType.VarChar).Value = addZakrepStatusTextBox.Text;.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void findZakrep_Click(object sender, EventArgs e)

{(rbZakrepDriver.Checked)

{

закреплениеBindingSource.Position =

закреплениеBindingSource.Find("Водитель", searchZakrepTextBox.Text);

}(rbZakrepTO.Checked)

{

закреплениеBindingSource.Position =

закреплениеBindingSource.Find("Техосмотр", searchZakrepTextBox.Text);

}(rbZakrepStatus.Checked)

{

закреплениеBindingSource.Position =

закреплениеBindingSource.Find("Статус", searchZakrepTextBox.Text);

}

}

//Редактирование таблицы Зарплатыvoid refreshZarplati_Click(object sender, EventArgs e)

{.зарплатыTableAdapter.Fill(this.auto_Pred_DBDataSet.Зарплаты);

}

void addZarplati_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();

com = con.CreateCommand();.CommandText = "EXECUTE SPaddZarplati @Зарплата,@КолвоСмен,@Премиальные";

{.Parameters.Add("@Зарплата", SqlDbType.Money).Value = addZarplatiZarplataTextBox.Text;.Parameters.Add("@КолвоСмен", SqlDbType.Int).Value = Convert.ToInt32(addZarplatiKolvoSmenTextBox.Text);.Parameters.Add("@Премиальные", SqlDbType.Money).Value = addZarplatiPremialnieTextBox.Text;.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void delZarplati_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();com = con.CreateCommand();.CommandText = "EXECUTE SPdelZarplati @Зарплата";

{.Parameters.Add("@Зарплата", SqlDbType.Money).Value = delZarplatiTextBox.Text;.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void changeZarplati_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();

com = con.CreateCommand();.CommandText = "EXECUTE SPchangeZarplati @Зарплата,@КолвоСмен,@Премиальные";

{.Parameters.Add("@Зарплата", SqlDbType.Money).Value = addZarplatiZarplataTextBox.Text;.Parameters.Add("@КолвоСмен", SqlDbType.Int).Value = Convert.ToInt32(addZarplatiKolvoSmenTextBox.Text);.Parameters.Add("@Премиальные", SqlDbType.Money).Value = addZarplatiPremialnieTextBox.Text;.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void findZarplati_Click(object sender, EventArgs e)

{(rbZarplatiZarplata.Checked)

{

зарплатыBindingSource.Position =

зарплатыBindingSource.Find("Зарплата", searchZarplatiTextBox.Text);

}(rbZarplatiKolvoSmen.Checked)

{

зарплатыBindingSource.Position =

зарплатыBindingSource.Find("Кол-во_Смен", searchZarplatiTextBox.Text);

}(rbZarplatiPremialnie.Checked)

{

зарплатыBindingSource.Position =

зарплатыBindingSource.Find("Премиальные", searchZarplatiTextBox.Text);

}

}

//Редактирование таблицы Маршрутыvoid refreshMarsh_Click(object sender, EventArgs e)

{.маршрутыTableAdapter.Fill(this.auto_Pred_DBDataSet.Маршруты);

}

void addMarsh_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();

com = con.CreateCommand();.CommandText = "EXECUTE SPaddMarsh @Маршрут,@Назначение,@Расстояние";

{.Parameters.Add("@Маршрут", SqlDbType.Int).Value = Convert.ToInt32(addMarshNumberTextBox.Text);.Parameters.Add("@Назначение", SqlDbType.VarChar).Value = addMarshNaznachenieTextBox.Text;.Parameters.Add("@Расстояние", SqlDbType.Int).Value = Convert.ToInt32(addMarshRasstoyanieTextBox.Text);.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void delMarsh_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();com = con.CreateCommand();.CommandText = "EXECUTE SPdelMarsh @Маршрут";

{.Parameters.Add("@Маршрут", SqlDbType.Int).Value = Convert.ToInt32(delMarshTextBox.Text);.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void changeMarsh_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();

com = con.CreateCommand();.CommandText = "EXECUTE SPchangeMarsh @Маршрут,@Назначение,@Расстояние";

{.Parameters.Add("@Маршрут", SqlDbType.Int).Value = Convert.ToInt32(addMarshNumberTextBox.Text);.Parameters.Add("@Назначение", SqlDbType.VarChar).Value = addMarshNaznachenieTextBox.Text;.Parameters.Add("@Расстояние", SqlDbType.Int).Value = Convert.ToInt32(addMarshRasstoyanieTextBox.Text);.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void findMarsh_Click(object sender, EventArgs e)

{(rbMarshNumber.Checked)

{

маршрутыBindingSource.Position =

маршрутыBindingSource.Find("Маршрут", searchMarshTextBox.Text);

}(rbMarshNaznachenie.Checked)

{

маршрутыBindingSource.Position =

маршрутыBindingSource.Find("Назначение", searchMarshTextBox.Text);

}(rbMarshRasstoyanie.Checked)

{

маршрутыBindingSource.Position =

маршрутыBindingSource.Find("Расстояние", searchMarshTextBox.Text);

}

}

//Редактирование таблицы Отпускаvoid refreshOtpuska_Click(object sender, EventArgs e)

{.отпускаTableAdapter.Fill(this.auto_Pred_DBDataSet.Отпуска);

}

void addOtpuska_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();

com = con.CreateCommand();.CommandText = "EXECUTE SPaddOtpuska @Отпуск,@Длительность,@Отпускные";

{.Parameters.Add("@Отпуск", SqlDbType.Int).Value = Convert.ToInt32(addOtpuskaNumberTextBox.Text);.Parameters.Add("@Длительность", SqlDbType.Int).Value = Convert.ToInt32(addOtpuskaDlitTextBox.Text);.Parameters.Add("@Отпускные", SqlDbType.Money).Value = addOtpuskaOtpusknieTextBox.Text;.ExecuteNonQuery();

}(Exception)

{.Show("Ошибка ввода", "Сообщение"););

}

{.Close();_Click(sender, e);

}

}

void delOtpuska_Click(object sender, EventArgs e)

{con = new SqlConnection(tmpstr);.Open();com = con.CreateCommand();.CommandText = "EXECUTE SPdelOtpuska @Отпуск";

{.Parameters.Add("@Отпуск", SqlDbType.Int).Value = Convert.ToInt32(delOtpuskaTextBox.Text);.ExecuteNonQuery();

}(Exception)

Cursor

Первый способ. Метод query()

А извлечение данных происходит через метод query(). Данные хранятся в наборе строк, которые можно представить в виде таблицы. Из этой таблицы вы уже можете извлечь конкретное значение.

У метода query() множество параметров. В первом параметре укажите имя таблицы, во втором - массив имён колонок, далее идут дополнительные условия. Пока везде оставим null. В нашем примере мы добавили одну запись и извлечь её просто.

Мы переходим к первой записи (метод moveToFirst()) и считываем данные, которые выводим в текстовой метке.

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

Второй способ. Метод rawQuery()

Публикация и результат.


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

Само приложение:


Наверх