Обзор программных средств для создания баз данных. Как я создаю базу данных для своих приложений

Как было упомянуто выше, правильное использование специализированных компонент ставит их по производительности практически на одну ступень с вызовами API выбранной СУБД. На мой взгляд, использование API оправданно в том редком случае, когда возможностей даже специфических компонент для разработки недостаточно, хотя это и крайне маловероятно, или если для платформы, под которую ведется разработка, такие компоненты отсутствуют (Sun Solaris). Создание запросов к базе данных. Выбрав стратегию доступа к данным и определившись с архитектурой приложения, можно обратить внимание на то, каким образом мы собираемся их использовать. Главное правило состоит в том, что чем меньше вы запрашиваете данных у сервера, тем быстрее будет работать ваше приложение. Конечно, запрашивать у сервера меньше данных, чем пользователь хочет увидеть за один раз, нерационально, поэтому первым вопросом должен быть "какие данные необходимы для каждого модуля системы?" Разработчикам, переходящим с настольных баз данных, требуется перебороть в себе таблично ориентированное представление о базах данных. База InterBase, несомненно, содержит таблицы. Но при проектировании программы вы их не видите, вы видите только результат выполнения запроса SQL. Можно, конечно, написать запрос, который возвращает все записи из таблицы (по крайней мере, видимые для данной транзакции):

SELECT * FROM SOME_TABLE

Но в большинстве случаев такой запрос вернет значительно больше данных, чем это требуется для оптимальной работы пользовательского интерфейса и обработки бизнес-процессов. Подобный запрос, кстати, не использует такие полезные особенности InterBase/ Firebird, как возможность объединения (JOIN) и сортировки (ORDER BY) результирующего набора данных.

Запрашиваете меньше данных - получаете большую скорость. Для осуществления определенных задач в программе вам могут быть не нужны все столбцы таблицы. Фактически не стоит часто использовать знак "*" в запросах выборки, лучше использовать прямое перечисление полей. Подобный способ основывается на том, что даже если мне нужны все столбцы таблицы, мне не нужны столбцы таблицы, которые будут добавлены в будущем, когда я завершу эту часть программы. Определение конкретных столбцов в запросе гарантирует, что я получу только те столбцы, которые я заявил в запросе, даже если структура таблицы будет развиваться дальше. Аналогично даже если пользователь действительно нуждается во всех без исключения записях из таблицы, ему необязательно видеть их все в один момент времени. Пользователю может быть крайне неудобно искать поля в середине сетки данных в таблице с количеством записей выше среднего. Скажем, если у вас в таблице более 100 записей, вам уже следует основательно подумать над дизайном вашего приложения.
К чему все это сводится? Вот к чему: чем меньше вы запрашиваете и пересылаете данных, тем быстрее ваше приложение будет работать, даже на не очень скоростных сетях. Вот несколько прикладных методов, которые вы можете использовать для уменьшения количества выбираемых (SELECT) данных.

Обеспечьте пользователю хорошие инструментальные средства для поиска записей, которые его интересуют. Если список слишком велик, чтобы отображать его в единственном неразрывном виде, разбейте его на логические страницы с табуляцией по первым буквам от "А" до "Я". Если и в этом случае списки получаются слишком длинными, предоставьте пользователю мощные средства фильтрации данных для сужения полученного в результате применения фильтра множества записей. Для реализации поиска данных в приложении вы можете взять на вооружение методы, используемые для поиска web-страниц. Когда пользователю выдается набор записей, даже если он сравнительно небольшой, достаточно использовать одно-два ключевых поля для формирования фильтра запроса. Пусть в приложении будет отдельное окно или часть окна, где пользователь может увидеть все данные по записи, если он обнаружил то, что искал. Старайтесь также использовать объединения таблиц (JOIN) в запросах вместо lookup-полей на формах всюду, где это будет возможно. Хотя и возможно оптимизировать выполнение метода TDataset. Lookup, даже этот улучшенный метод не будет работать быстрее объединения таблиц (JOIN) - про работу немодифицированного метода вообще можно не упоминать.

Кафедра “Прикладной информатики”

Пояснительная записка к курсовой работе

по дисциплине:

“Базы данных”

“Разработка базы данных и клиентского приложения”

Калуга 2009


Введение

1.Постановка задачи

2.Проектирование, создание и управление Базой Данных

3.Технологическая инструкция пользователя

Заключение

Список используемой литературы


Введение

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

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

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

Базы данных встречаются на каждом шагу. Практически любая система это хорошо построенная база данных, например всем известный “Консультант +” или же учет единого налога в министерстве налогов и сборов.

Моя база данных предназначена для автоматизации операций, получения достоверной и оперативной информации.

Задачи курсовой работы состоят в следующем:

Реализовать базу данных;

Реализовать пользовательский интерфейс;

Составить отчеты;

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


1.Постановка задачи

Разработанная база дынных состоит из нескольких “уровней”. Самый абстрактный “уровень” это схема данных. На этом уровне непосредственно отображены связи между таблицами.

В данной курсовой работе поставлены задачи:

Построение физической модели на компьютере (при помощи Erwin);

Определение связей, типов данных;

Разработка удобного пользовательского интерфейса;

Создание запросов, форм;

Создание отчетов (по заданию);

Построение главной кнопочной формы;

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

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

Учет товаров;

Учет товара по группам;

Учет товаров по чекам;

Данная система предназначена для автоматизации этих операций, получения достоверной и оперативной информации, формирования выходных документов.

2. Проектирование, создание и управление Базой Данных

В базе данных реализовано 4 таблицы.

1)Таблица Группа товара, содержит 2 столбца Номер группы товара и Название группы товара.


2) Таблица Товар, содержит 4 столбца Номер_товара, Название товара, Цена, Номер группы товара.


3) Таблица чек, содержит 2 столбца: Номер_чека, Дата.

4) Таблица Товар по чеку, содержит 3 столбца: Номер товара, Номер чека. Количество.

Для удобства работы с базой данных было создано несколько форм.

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

Формы для запросов.

1)Форма для запроса1(см. Рис. 1)

Необходимо вывести товар по определённому номеру чека. В этой форме представлен удобный интерфейс для ввода информации, а также удобного просмотра отчета.


Рис. 1 Форма для запроса1

Например. Вводим в textBox номер чека – 7, и нажимаем на кнопку – Просмотр отчета.(см. Рис. 2)


Рис. 2 Работа отчета1

2)Форма для запроса2

Необходимо вывести товар по дате. В этой форме представлен удобный интерфейс для ввода информации, а также удобного просмотра отчета.


Рис. 3 Форма для запроса2

Например. Вводим в textBox дату – 12.11.08 и нажимаем на кнопку – Просмотр отчета. (см. Рис4)


Рис. 4 Работа запроса2


Организация введения данных в таблицы происходит через соответствующие формы. Для удобства была создана главная кнопочная форма. (см. Рис. 5)

Эта форма выглядит так:


Рис. 5 Кнопочная форма

Здесь расположено главное меню. Каждая из кнопок открывает доступ к отчетам, при нажатии, можно очень просто просмотреть отчеты.

В подменю Таблицы в удобной форме представлены таблицы для ввода информации.

Схема данных.(см. Рис. 6


Рис. 6 Схема данных

Схема данных была создана при помощи программы Erwin.

3. Технологическая инструкция пользователя

Например:

- Вводим новый товар.

Для того чтобы ввести новый товар необходимо выполнить следующие действия(см. Рис. 7):

Зайти на главную кнопочную форму -> нажать кнопку таблицы -> нажать кнопку товар -> ввести название товара его цену и выбрать к какой группе товаров он относится.


Рис. 7 Ввод нового сотрудника

Если в списке групп товаров нужной группы не то вводим её в ручную

Нажимаем кнопку Группа товара -> и вводим новую группу товара. (см. Рис 8)



Рис 8. Создание новой группы товара.


-> выбирает также номер чека по которому проходит данный товар -> вводим количество этого товара. (см. Рис 10)



Заключение

Цели курсовой работы выполнены полностью. Была разработана база данных, для учета товара. Курсовая работа создана в программе MS Access. Схема данных (физическая модель) была построена в программе Erwin. Также реализован удобный пользовательский интерфейс для безопасного и легкого ввода информации. В данной работе также выполнены задачи, которые ставились в начале курсовой работы, все задачи решены, и их решение можно просмотреть непосредственно в курсовой работе.

Разработав эту курсовую работу, я понял, что СУБД Microsoft Access мощный и удобный инструмент для создания баз данных. Графический многооконный интерфейс, который дает возможность мне в диалоговом режиме создавать таблицы, формы, запросы, отчеты. Специальные приспособления, которые автоматизируют работу во время создания и ведения базы данных (Мастера и Конструкторы, Ассистенты и т.п.) заметно упрощают весь процесс и делают программу доступной в изучении каждому.

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

А так же было очень интересно и удобно работать в MS Access, создавать формы, работать со справкой, просматривать и изучать книги по базам данных и в частности MS Access. Несомненно, удалось познакомиться с такой замечательной программой как Erwin, которая помогает быстрее и лучше разобраться в создании баз данных. Конечно, современные базы данных с каждым днем становятся все больше и больше, удовлетворяя потребностям пользователей, следовательно, возникает задача, как создать такие базы данных, как ими управлять.… Прочитав и разобрав эту курсовую работу можно, несомненно, получить базовые навыки в построении баз данных.

Список используемой литературы

1. Microsoft Access 2000. Шаг за шагом: Практ. пособ. / Пер. с англ.

М.: Издательство ЭКОМ, 2002. - 352 с.: илл.

2. Самоучитель: Office Access 2003. - СПб.: Питер, 2004. - 464 с.: ил.

3. Базы данных. Проектирование, реализация и сопровождение. Теория и

практика. 3-е издание. : Пер. с англ. - М. : Издательский дом "Вильяме",

2003. - 1440 с. : ил. - Парал. тит. англ.

  • Разработка под Android
    • Tutorial
    • Recovery Mode

    Всем привет! Меня зовут Олег и я программист-любитель под Android. Любитель потому что в данный момент я зарабатываю деньги программированием в совсем другом направлении. А это хобби, которому я посвящаю свое свободное время. К сожалению у меня нет знакомых программистов под Android и все свои базовые знания я черпаю либо из книг, либо из интернета. Во всех тех книжках и статьях в интернете, которые я читал, созданию базы данных для приложения отводится крайне мало места и по сути все описание сводится к созданию класса являющегося наследником SQLiteOpenHelper и последующему внедрению SQL кода в Java код. Если не считать, что мы получаем плохо читаемый код (а если в нашем приложении появляется больше 10 таблиц, то вспоминать все эти взаимосвязи между таблицами тот еще ад), то в принципе жить можно конечно, но как-то совершенно не хочется.
    Забыл сказать самое главное, можно сказать что это моя проба пера тут. И так поехали.

    О вечном вопросе: почему?

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


    Если в нашем приложении больше 5 таблиц, то уже было бы не плохо использовать какой-нибудь инструмент для визуального проектирования архитектуры БД. Поскольку для меня это хобби, то и использую я абсолютно бесплатный инструмент под названием Oracle SQL Developer Data Modeler (скачать его можно ).

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

    Спроектировав саму архитектуру, приступаем к более нудной части, заключающийся в созданий sql кода для создания таблиц. Для помощи в этом вопросе, я уже использую инструмент под названием SQLiteStudio (его в свою очередь можно скачать тут ).

    Данный инструмент является аналогом таких известных продуктов как SQL Naviagator, Toad etc. Но как следует из названия, заточен он под работу с SQLite. Он позволяет визуально создать БД и получить DDL код создаваемых таблиц. Кстати, он также позволяет создавать представления (View), которые вы тоже при желании можете использовать в своем приложении. Не знаю насколько правильный подход использования представлений в программах для Android, но в одном из своих приложений я использовал их.

    Собственно говоря я больше не каких сторонних инструментов не использую, и дальше начинается магия с Android Studio. Как я уже писал выше, если начать внедрять SQL код в Java код, то на выходе мы получим плохочитаемый, а значит и плохо расширяемый код. Поэтому я выношу все SQL инструкции во внешние файлы, которые у меня находятся в директории assets . В Android Studio выглядит это примерно так:


    О директориях db и data

    Внутри директории assets я создал две директории db_01 и data_01 . Цифры в названиях директорий соответствуют номеру версии моей БД с которой я работаю. В директории db у меня хранятся сами SQL скрипты создания таблиц. А в директории data хранятся данные необходимые для начального заполнения таблиц.


    Теперь давайте посмотрим на код внутри моего DBHelper который я использую в своих проектах. Сначала переменные класса и конструктор (тут без каких либо неожиданностей):

    Private static final String TAG = "RoadMap4.DBHelper"; String mDb = "db_"; String mData = "data_"; Context mContext; int mVersion; public DBHelper(Context context, String name, int version) { super(context, name, null, version); mContext = context; mVersion = version; }
    Теперь метод onCreate и тут становится уже интереснее:

    @Override public void onCreate(SQLiteDatabase db) { ArrayList tables = getSQLTables(); for (String table: tables){ db.execSQL(table); } ArrayList> dataSQL = getSQLDatas(); for (HashMap hm: dataSQL){ for (String table: hm.keySet()){ Log.d(TAG, "insert into " + table + " " + hm.get(table)); long rowId = db.insert(table, null, hm.get(table)); } } }
    Логически он разделен на два цикла, в первом цикле я получаю список SQL - инструкций для создания БД и затем выполняю их, во втором цикле я уже заполняю созданные ранее таблицы начальными данными. И так, шаг первый:

    Private ArrayList getSQLTables() { ArrayList tables = new ArrayList<>(); ArrayList files = new ArrayList<>(); AssetManager assetManager = mContext.getAssets(); String dir = mDb + mVersion; try { String listFiles = assetManager.list(dir); for (String file: listFiles){ files.add(file); } Collections.sort(files, new QueryFilesComparator()); BufferedReader bufferedReader; String query; String line; for (String file: files){ Log.d(TAG, "file db is " + file); bufferedReader = new BufferedReader(new InputStreamReader(assetManager.open(dir + "/" + file))); query = ""; while ((line = bufferedReader.readLine()) != null){ query = query + line; } bufferedReader.close(); tables.add(query); } } catch (IOException e) { e.printStackTrace(); } return tables; }
    Тут все достаточно просто, мы просто читаем содержимое файлов, и конкатенируем содержимое каждого файла в элемент массива. Обратите внимание, что я произвожу сортировку списка файлов, так как таблицы могут иметь внешние ключи, а значит таблицы должны создаваться в определенном порядке. Я использую нумерацию в название файлов, и с помощью нею и произвожу сортировку.

    Private class QueryFilesComparator implements Comparator{ @Override public int compare(String file1, String file2) { Integer f2 = Integer.parseInt(file1.substring(0, 2)); Integer f1 = Integer.parseInt(file2.substring(0, 2)); return f2.compareTo(f1); } }
    С заполнением таблиц все веселей. Таблицы у меня заполняются не только жестко заданными значениями, но также значениями из ресурсов и UUID ключами (я надеюсь когда-нибудь прийти к сетевой версии своей программы, что бы мои пользователи могли работать с общими данными). Сама структура файлов с начальными данными выглядит так:


    Несмотря на то, что файлы у меня имеют расширение sql, внутри не sql код а вот такая штука:

    Prioritys
    pri_id:UUID:UUID

    pri_name:string:normal
    pri_color:color:colorGreen
    pri_default:int:1
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_task
    pri_name:string:hold
    pri_color:color:colorBlue
    pri_default:int:0
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_task
    pri_name:string:important
    pri_color:color:colorRed
    pri_default:int:0
    prioritys
    pri_id:UUID:UUID

    pri_name:string:normal
    pri_color:color:colorGreen
    pri_default:int:1
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_project
    pri_name:string:hold
    pri_color:color:colorBlue
    pri_default:int:0
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_project
    pri_name:string:important
    pri_color:color:colorRed
    pri_default:int:0

    Структура файла такая: я выполняю вызов функции split(":") применительно к строчке и если получаю что ее размер равен 1 то значит это название таблицы, куда надо записать данные. Иначе это сами данные. Первое поле это название поля в таблице. Второе поле тип, по которому я определяю что мне надо в это самое поле записать. Если это UUID - это значит мне надо сгенерировать уникальное значение UUID. Если string значит мне надо из ресурсов вытащить строковое значение. Если color, то опять-таки, из ресурсов надо вытащить код цвета. Если int или text, то я просто преобразую данное значение в int или String без каких либо телодвижений. Сам код выглядит вот так:

    Private ArrayList> getSQLDatas() { ArrayList> data = new ArrayList<>(); ArrayList files = new ArrayList<>(); AssetManager assetManager = mContext.getAssets(); String dir = mData + mVersion; try { String listFiles = assetManager.list(dir); for (String file: listFiles){ files.add(file); } Collections.sort(files, new QueryFilesComparator()); BufferedReader bufferedReader; String line; int separator = 0; ContentValues cv = null; String fields; String nameTable = null; String packageName = mContext.getPackageName(); boolean flag = false; HashMap hm; for (String file: files){ Log.d(TAG, "file db is " + file); bufferedReader = new BufferedReader(new InputStreamReader(assetManager.open(dir + "/" + file))); while ((line = bufferedReader.readLine()) != null){ fields = line.trim().split(":"); if (fields.length == 1){ if (flag == true){ hm = new HashMap<>(); hm.put(nameTable, cv); data.add(hm); } // наименование таблицы nameTable = line.trim(); cv = new ContentValues(); continue; } else { if (fields.equals("UUID")){ cv.put(fields, UUID.randomUUID().toString()); } else if (fields.equals("color") || fields.equals("string")){ int resId = mContext.getResources().getIdentifier(fields, fields, packageName); Log.d(TAG, fields + " " + resId); switch (fields){ case "color": cv.put(fields, resId); break; case "string": cv.put(fields, mContext.getString(resId)); break; default: break; } } else if (fields.equals("text")){ cv.put(fields, fields); } else if (fields.equals("int")){ cv.put(fields, Integer.parseInt(fields)); } } flag = true; } bufferedReader.close(); } } catch (IOException e) { e.printStackTrace(); } return data; }

    Создадим простое приложение баз данных, которое выводит на экранную форму информацию из таблицы «Туристы» и связанную с текущей записью таблицы «Туристы» запись таблицы «Информация о туристах» из базы данных Microsoft Access.

    Для этого создадим пустое Windows-приложение. Внешний вид среды

    разработки приведен на рисунке 39 .

    Рис. 39. Пустое приложение

    На рисунке 39 выделена группа компонентов «Данные» («Data»), которая содержит компоненты для доступа к данным и манипулирования ими.

    Привязку данных БД к форме осуществляет компонент «Binding Source». Перенесем его на форму. После размещения его на форме среда разработки принимает следующий вид (рис. 40).

    Рис. 40. Компонент Binding Source на форме

    Компонент является не визуальным, поэтому он отображается на дополнительной панели. Основным свойством компонента является свойство DataSource, указывающее на источник данных. По умолчанию свойство является пустым, поэтому необходимо сформировать его значение. При выборе данного свойства в окне свойств появляется следующее окно (рис. 41).

    Рис. 41. Список источников данных

    В настоящий момент список пуст, поэтому необходимо создать новый источник данных, выбрав команду «Add Project Data Source» для создания нового источника данных и соединения с ним. Появляется следующее окно диалога (рис. 42).

    Рис. 42. Список источников данных

    Данный диалог предоставляет следующий выбор источников данных:

    Database - База данных;

    Service - Служба, это некоторый сервис, предоставляющий данные. Чаще всего это Web-сервис;

    Object - Объект для выбора объекта, который будет генерировать данные и объекты для работы с ними.

    В нашем случае необходимо выбрать пункт «База данных» («Database»). Появляется окно выбора соединения с данными (рис. 43).

    Рис. 43. Выбор соединения с данными

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

    В выпадающем списке диалога находятся все создаваемые ранее соединения. Если необходимого соединения в списке нет, то следует использовать кнопку «Создать подключение» («New connection»). Нажатие кнопки приводит к появлению следующего диалога (рис. 44).

    В данном диалоге выбирается тип источника данных (в данном случае Microsoft Access), имя базы данных (в данном случае имя и местоположение файла базы данных), имя пользователя и пароль, используемые для подключения к базе данных. Кнопка «Дополнительно» («Advanced») позволяет задать большое количество параметров, относящихся к различным деталям механизма ADO. Использование кнопки «Проверить подключение» («Test Connection») позволит убедиться в правильности введенных параметров и работоспособности соединения.

    Рис. 44. Создание нового соединения

    Последний шаг диалога - выбор тех таблиц или иных объектов базы данных, которые необходимы в данном источнике данных. Окно выбора представлено на рисунке 45.

    Рис. 45. Выбор необходимых таблиц

    В данном окне выбраны таблицы «Туристы» и «Информация о туристах». Поскольку иных объектов, кроме таблиц, в базе данных не было создано, на рисунке 45 отображаются только таблицы. На этом создание источника данных завершено. После нажатия кнопки «Готово» («Finish») рядом с компонентом BindingSource на форме появляется компонент DataSet.

    Теперь данные, подключенные выше, необходимо отобразить на форме. Простейшим способом отображения данных является использование компонента DataGridView из группы компонентов Data. Компонент является визуальным и на форме выглядит следующим образом (рис. 46).

    Рис. 46. Компонент DataGridView

    Сразу же возникает окно настройки компонента, которое определяет его возможности по редактированию данных: «Включить редактирование» («Enable Adding»), «Включить правку» («Enable Editing»), «Включить удаление» («Enable Deleting»); возможность изменения последовательности столбцов: «Включить возможность изменения порядка столбцов» («Enable Column Reordering»); а также возможность закрепления в контейнере-родителе.

    Для того чтобы компонент мог отображать данные, необходимо выбрать источник данных в выпадающем списке. Выбор выпадающего списка приводит к появлению следующего диалога (рис. 47).

    Рис. 47. Выбор источника данных для DataGridView

    В данном случае мы выбрали в качестве источника данных таблицу «Туристы». Данный выбор изменяет экранную форму следующим образом (рис. 48).

    Рис. 48. Компонент DataGridView отображает структуру таблицы

    На рисунке видно, что появился еще один компонент BindingSource и компонент TableAdapter, работающий с таблицей «Туристы». Обратите внимание, что в design-time или в процессе разработки данные из таблицы не отображаются.

    Теперь необходимо отобразить данные из связанной таблицы «Информация о туристах». Для этого разместим на форме еще один компонент DataGridView и в качестве источника данных выберем следующее (рис. 49).

    Рис. 49. Выбор источника данных для второго DataGridView

    Здесь в качестве источника данных выступает не сама таблица «Информация о туристах», а связь (Binding Source) между таблицами «Туристы» и «Информация о туристах». Такой выбор гарантирует выбор из таблицы «Информация о туристах» только тех строк, которые связаны с текущей строкой в таблице «Туристы». Также такой выбор гарантирует правильность обновления и удаления связанных данных. Работа полученного приложения показана на рисунке 50.

    Рис. 50. Приложение базы данных в работе

    Перемещение по данным при помощи стрелочных клавиш является неудобным. Для упрощения навигации по данным существует компонент BindingNavigator. Поместим его на форме (рис. 51).

    Рис. 51. Компонент BindingNavigator на форме

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

    Свойством, определяющим таблицу, по которой производится навигация, является свойство BindingSource. Установим значение этого свойства равным «туристыBindingSource». В работе компонент выглядит следующим образом (рис. 52).

    Рис. 52. Компонент BindingNavigator в работе

    Редактирование данных в ячейках компонента DataGridView при соответствующих настройках возможно, но неудобно и не рационально. В частности, трудно проверять введенные значения на ошибки. Поэтому для таблицы «Туристы» сделаем экранную форму, позволяющую отображать данные в компонентах TextBox и редактировать их. Для этого разместим на форме контейнер типа Panel, а на нем три компонента TextBox следующим образом (рис. 53).

    Рис. 53. Экранная панель для редактирования записей таблицы «Туристы»

    Теперь необходимо осуществить привязку компонентов TextBox к соответствующим полям таблицы «Туристы». Для этого используем свойство из группы DataBindings - Advanced, показанное на рисунке 54.

    Рис. 54. Свойство «DataBindings - Advanced»

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

    Для верхнего компонента TextBox в выпадающем списке Binding выберем источником данных «туристыBmdmgSource» и поле источника - «Фамилия». Для среднего и нижнего компонентов TextBox выберем тот же источник данных и поля «Имя» и «Отчество» соответственно.

    Разработанное приложение в работе выглядит следующим образом (рис. 56).

    Рис. 55. Окно диалога для свойства «DataBindings - Advanced»

    Рис. 56. Привязка данных к визуальным компонентам

    Однако при внесении изменений все новые данные остаются только на форме. В базе данных они не сохраняются, и при повторном вызове приложения, конечно же, будут отсутствовать. Это происходит потому, что данные были загружены в объект DataSet, который представляет собой копию таблицы в памяти. Все действия выполняются с этой копией. Для того чтобы изменения отобразились в базе данных, необходимо выполнить метод Update класса TableAdapter. Таким образом, в разрабатываемом приложении необходимо разместить кнопку «Обновить» и записать в обработчик события Click следующий программный код:

    туристыTableAdapteгUpdate(bDTur_firmDataSet); информация_о_туристахTableAdapter.Update(bDTur_firmDataSet);

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

    Delphi -- среда разработки, использует язык программирования Delphi (начиная с 7 версии язык в среде именуется Delphi, ранее -- Object Pascal), разработанный фирмой Borland и изначально реализованный в её пакете Borland Delphi, от которого и получил в 2003 году своё нынешнее название. Object Pascal, по сути является наследником языка Pascal с объектно-ориентированными расширениями.

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

    Особенности семейства Delphi 7:

    *Среда быстрой разработки приложений, в которой интегрированы средства моделирования разработки и развертывания приложений электронной коммерции и Web-сервисов.

    *Поддержка языков программирования для Win32 (Delphi и C/C++) и для.NET (Delphi и C#) в единой среде разработки, что позволяет упростить сопровождение и создание новых приложений Win32 и более легко освоить технологии.NET;

    *Возможность как для разработчиков традиционных приложений под Windows, так и для разработчиков, использующих Java, разрабатывать приложения.NET без отказа от используемого инструментария, с сохранением навыков и с аналогичными концепциями программирования;

    *Новая система шаблонов кода и другие нововведения среды разработки качественно улучшают работу с исходными текстами и повышают производительность разработки;

    Microsoft SQL Server 2000 - это законченное предложение в области баз данных и анализа данных для быстрого создания масштабируемых решений электронной коммерции, бизнес-приложений и хранилищ данных.

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

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

    Разработка приложений баз данных является одной из наиболее востребованных возможностей среды программирования Delphi. Мощность и гибкость Delphi при работе с базами данных основана на низкоуровневом ядре - процессоре баз данных Borland Database Engine (BDE). Его интерфейс с прикладными программами называется Integrated Database Application Programming Interface (IDAPI). BDE позволяет осуществлять доступ к данным как с использованием традиционного record-ориентированного (навигационного) подхода, так и с использованием set-ориентированного подхода, используемого в SQL-серверах баз данных.

    Библиотека объектов содержит набор визуальных компонент, значительно упрощающих разработку приложений для СУБД с архитектурой клиент-сервер. Объекты инкапсулируют в себя нижний уровень - Borland Database Engine.

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

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

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

    Объекты БД в Delphi основаны на SQL и включают в себя полную мощь Borland Database Engine. В состав Delphi также включен Borland SQL Link, поэтому доступ к СУБД Oracle, Sybase, Informix и InterBase происходит с высокой эффективностью. Кроме того, Delphi включает в себя локальный сервер Interbase для того, чтобы можно было разработать расширяемые на любые внешние SQL-сервера приложения в офлайновом режиме.

    Масштабируемость на практике -- одно и то же приложение можно использовать как для локального, так и для более серьезного клиент-серверного вариантов.

    Хотя Delphi не имеет своего формата таблиц БД, она тем не менее обеспечивает мощную поддержку большого количества различных СУБД -- как локальных (например, dBase или Paradox), так и промышленных (например, Sybase или InterBase).