BASIC-256. Глава 19
Методические материалыАвтор: Владимир Черный
Продолжаем публиковать перевод книги Джеймса Рено. Эту главу перевел Владимир Черный.
Оглавление:
- Глава 1: Знакомство с BASIC-256 – cкажи «Привет»
- Глава 2: Рисуем основные фигуры
- Глава 3: Звуки и музыка
- Глава 4: Мыслить как программист
- Глава 5: Программа задает вам вопросы
- Глава 6: Сравнения, сравнения, сравнения
- Глава 7: Циклы и счетчики — повторяем снова и снова
- Глава 8: Графика на заказ — создание фигур своими руками
- Глава 9: Подпрограммы — повторное использование кода
- Глава 10: Управляем мышкой, перемещаем объекты
- Глава 11: Использование клавиатуры для управления программой
- Глава 12: Картинки, музыка и спрайты
- Глава 13 Массивы — коллекции данных
- Глава 14 Математика — развлечемся с числами
- Глава 15 Работаем со строками
- Глава 16 Файлы. Сохраним информацию на будущее
- Глава 17 Стеки, очереди, списки и сортировка
- Глава 18 Ловушки для ошибок времени исполнения
Глава 19 Программирование баз данных
В этой главе вы увидите, как BASIC-256 может установить соединение с простой реляционной базой данных для хранения в ней и получения из нее полезных данных.
Что такое база данных
База данных, говоря упрощенно, — это организованная коллекция чисел, строк и информации другого типа. Наиболее известны базы данных реляционного типа. Реляционные базы данных состоят из четырех главных составляющих: таблиц, строк, колонок и отношений между ними (связей, см табл 8).
| Таблица | Таблица состоит из заранее определенного числа колонок и любого количества строк содержащих информацию об объектах или субъектах. Таблицу также называют отношением. | 
| Строка | Также называемая кортеж | 
| Колонка | Также называют атрибут | 
| Связи | Ссылка ключевого столбца одной таблицы на колонку другой таблицы, создающее взаимосвязь таблиц. | 
Таблица 8 Главные компоненты реляционной базы данных.
Язык SQL
Большинство реляционных баз данных сегодня используют язык, называемый SQL для выбора и управления данными. SQL это акроним от Structured Query Language — Структурированный язык запросов. Первый SQL язык был разработан IBM в 1970 году и стал главным языком используемым в реляционных базах.
SQL достаточно мощный язык и был реализован многими компаниями за все годы с момента появления. В результате такого многообразия появилось и используется множество различных диалектов языка SQL. BASIC-256 использует SQLite в качестве системы управления базой данных. Пожалуйста ознакомьтесь с диалектом этого SQL языка на веб-странице SQLite: http://www.sqlite.org, поскольку данный диалект используется в приведенных ниже примерах.
Создание базы и добавление данных в нее
SQLite база данных не требует установки сервера или создания какой-то сложной системы. База данных и все ее части хранятся в простом файле на вашем компьютере. Этот файл можно скопировать на другой компьютер и использовать там без проблем. Первая программа (программа 102. Создаем базу данных) создает новый файл базы данных и таблицы. Таблицы представлены на ER-диаграмме (см. рис.34)

Рисунок 34 ER-диаграмма базы данных
  1 # chapter 19 dbcreate.kbs
  2 # Удаляем прежний файл базы данных и создаем базу с двумя таблицами
  3 errors = 0
  4 file$ = "pets.sqlite3"
  5 if exists(file$) then kill(file$)
  6 dbopen file$
  7
  8 stmt$ = "CREATE TABLE owner (owner_id INTEGER, ownername TEXT, phonenumber TEXT, PRIMARY KEY (owner_id));"
  9 gosub execute
 10
 11 stmt$ =  "CREATE TABLE pet (pet_id INTEGER, owner_id INTEGER, petname TEXT, type TEXT, PRIMARY KEY (pet_id), FOREIGN KEY (owner_id) REFERENCES owner (owner_id));"
 12 gosub execute
 13
 14 # Закрываем все.
 15 dbclose
 16 print file$ + " создан. " + errors + " ошибок."
 17 end
 18
 19 execute:
 20 print stmt$
 21 onerror executeerror
 22 dbexecute stmt$
 23 offerror
 24 return
 25
 26 executeerror:
 27 errors = errors + 1
 28 print "ERROR: " + lasterror + " " + lasterrormessage + " " + lasterrorextra
 29 return
Программа 102 Создаем базу данных
CREATE TABLE owner (owner_id INTEGER, ownername TEXT, phonenumber TEXT, PRIMARY KEY (owner_id));
CREATE TABLE pet (pet_id INTEGER, owner_id INTEGER, petname TEXT, type TEXT, PRIMARY KEY (pet_id), FOREIGN KEY (owner_id) REFERENCES owner (owner_id));
pets.sqlite3 создан. 0 ошибок.
Пример вывода программы 102 Создаем базу данных
В приведенной выше программе вы видели три новых функции для работы с базами данных: dbopen – открывает файл базы данных или создает новый, если файл не существует, dbexecute – выполняет SQL команду на открытой базе данных, и dbclose – закрывает открытый файл базы данных.
|  | dbopen имя_файла Открывает файл SQLite базы данных. Если база не существует, создается пустой файл базы данных. | 
|  | dbexecute sql-запрос Выполняет sql-запрос на текущей открытой базе данных. Эта функция не возвращает данных, но возможно перехватить ошибку, если таковая возникнет в процессе выполнения запроса. | 
|  | dbclose Закрывает текущий открытый файл SQLite базы данных. Эта функция гарантирует, что все данные будут записаны в файл базы. | 
Эти же три функции можно использовать и для выполнения других SQL запросов к базе. Например, вставка новых строк в таблицы (см программу 103) с помощью INSERT INTO и обновление имеющихся строк таблицы с помощью SQLзапроса UPDATE (см. программу 104).
  1 # chapter19 dbinsert.kbs
  2 # add rows to the database
  3
  4 file$ = "pets.sqlite3"
  5 dbopen file$
  6
  7 owner_id = 0
  8 pet_id = 0
  9
 10 ownername$ = "Джим": phonenumber$ = "555-3434"
 11 gosub addowner
 12 petname$ = "Пятнышко": type$ = "Кот"
 13 gosub addpet
 14 petname$ = "Фред": type$ = "Кот"
 15 gosub addpet
 16 petname$ = "Элвис": type$ = "Кот"
 17 gosub addpet
 18
 19 ownername$ = "Сью": phonenumber$ = "555-8764"
 20 gosub addowner
 21 petname$ = "Альфред": type$ = "Кот"
 22 gosub addpet
 23 petname$ = "Фидо": type$ = "Собака"
 24 gosub addpet
 25
 26 ownername$ = "Эми": phonenumber$ = "555-9932"
 27 gosub addowner
 28 petname$ = "Домино": type$ = "Собака"
 29 gosub addpet
 30
 31 ownername$ = "Ди": phonenumber$ = "555-4433"
 32 gosub addowner
 33 petname$ = "Сэм": type$ = "Козел"
 34 gosub addpet
 35
 36 # закрываем все
 37 dbclose
 38 end
 39
 40 addowner:
 41 owner_id = owner_id + 1
 42 stmt$ = "INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (" + owner_id + "," + chr(34) + ownername$ + chr(34) + "," + chr(34) + phonenumbe    r$ + chr(34) + ");"
 43 print stmt$
 44 onerror adderror
 45 dbexecute stmt$
 46 offerror
 47 return
 48
 49 addpet:
 50 pet_id = pet_id + 1
 51 stmt$ = "INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (" + pet_id + "," + owner_id + "," + chr(34) + petname$ + chr(34) + "," + chr(34) +     type$ + chr(34) + ");"
 52 print stmt$
 53 onerror adderror
 54 dbexecute stmt$
 55 offerror
 56 return
 57
 58 adderror:
 59 print "ERROR: " + lasterror + " " + lasterrormessage + " " + lasterrorextra
 60 return
Программа 103 Вставка строк в базу данных
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (1,"Джим","555-3434");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (1,1,"Пятнышко","Кот");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (2,1,"Фред","Кот");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (3,1,"Элвис","Кот");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (2,"Сью","555-8764");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (4,2,"Альфред","Кот");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (5,2,"Фидо","Собака");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (3,"Эми","555-9932");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (6,3,"Домино","Собака");
INSERT INTO owner (owner_id, ownername, phonenumber) VALUES (4,"Ди","555-4433");
INSERT INTO pet (pet_id, owner_id, petname, type) VALUES (7,4,"Сэм","Козел");
Пример вывода программы 103 Вставка строк в базу данных
  1 # chapter 19 dbupdate.kbs
  2 # Обновление данных
  3
  4 dbopen "pets.sqlite3"
  5
  6 # create and populate
  7 s$ = "UPDATE owner SET phonenumber = " + chr(34) + "555-5555" + chr(34) + " where owner_id = 1;"
  8 print s$
  9 dbexecute s$
 10 dbclose
Программа 104 Обновление данных строки
UPDATE owner SET phonenumber = "555-5555" where owner_id = 1;
Пример вывода программы 104 Обновление данных строки
Получение информации из базы данных
Итак, мы умеем открывать и закрывать файл базы данных, а также исполнять SQL-запрос, который не возвращает данных. База данных, из которой нельзя получить информацию достаточно бесполезна.
Оператор SELECT (выбор) языка SQL позволяет нам получать необходимые данные. После выполнения SQL-запроса содержащего оператор SELECT создается набор записей, содержащих информацию из строк и столбцов таблиц базы данных. Программа 105 демонстрирует три различных запроса на выборку данных и как BASIC-256 программа может их использовать.
  1 # chapter 19 dbselect.kbs
  2 # Get data from the pets database
  3
  4 dbopen "pets.sqlite3"
  5
  6 # Показываем владельцев и номера их телефонов
  7 print "Владельцы и номера телефонов"
  8 dbopenset "SELECT ownername, phonenumber FROM owner ORDER BY ownername;"
  9 while dbrow()
 10     print dbstring(0) + " " + dbstring(1)
 11 end while
 12 dbcloseset
 13
 14 print
 15
 16 # Показываем вадельцев и их питомцев
 17 print "Владельцы и питомцы"
 18 dbopenset "SELECT owner.ownername, pet.pet_id, pet.petname, pet.type FROM owner JOIN pet ON pet.owner_id = owner.owner_id ORDER BY ownername, petname;"
 19 while dbrow()
 20     print dbstring(0) + " " + dbint(1) + " " + dbstring(2) + " " + dbstring(3)
 21 end while
 22 dbcloseset
 23
 24 print
 25
 26 # Показываем среднее значение количества питомцев
 27 print "Среднее количество питомцев"
 28 dbopenset "SELECT AVG(c) FROM (SELECT COUNT(*) AS c FROM owner JOIN pet ON pet.owner_id = owner.owner_id GROUP BY owner.owner_id) AS numpets;"
 29 while dbrow()
 30     print dbfloat(0)
 31 end while
 32 dbcloseset
 33
 34 # Закрываем все
 35 dbclose
Программа 105 Получение данных из базы
Владельцы и номера телефонов
Джим 555-5555
Ди 555-4433
Сью 555-8764
Эми 555-9932
Владельцы и питомцы
Джим 1 Пятнышко Кот
Джим 2 Фред Кот
Джим 3 Элвис Кот
Ди 7 Сэм Козел
Сью 4 Альфред Кот
Сью 5 Фидо Собака
Эми 6 Домино Собака
Среднее количество питомцев
1.75
Пример вывода программы 105 Получение данных из базы
|  | dbopenset sql-запрос Выполняет запрос на выборку данных (SELECT) из базы данных создавая набор строк как результат, так что программно можно их читать. Результатом запроса может быть 0 или более строк в зависимости от запроса. | 
|  | dbrow dbrow() Читает очередную строку из набора строк сформированного функцией dbopenset. Если строчки кончились, возвращает false (ложь) Для чтения первой строки из набора необходимо использовать dbrow сразу после dbopenset. | 
|  | dbint (колонка) dbfloat (колонка) dbstring (колонка) Эти функции возвращают данные из текущей строки запроса. Необходимо знать цифровой номер (начинающийся с нуля) колонки с необходимыми данными. 
 | 
|  | dbcloseset Закрывает и сбрасывает результат предыдущего запроса функции dbopenset | 
Где скачать BASIC-256:
Для дистрибутивов ALT Linux
- ветка 4.0 basic256-0.9.6-alt5.M40.1.i586.rpm
- ветка 4.1 basic256-0.9.6-alt5.M41.1.i586.rpm
- ветка p5 basic256-0.9.6-alt5.M50P.1.i586.rpm
- ветка 5.1 basic256-0.9.6-alt5.M51.1.i586.rpm
Windows версия
http://basic256.org (http://www.sourceforge.net/projects/kidbasic)
Как установить BASIC-256 в Linux
Для Альт Линукс: настроить репозиторий и обновить/установить пакет через synaptic или apt
Для rpm-based дистрибутивов: rpm -Uvh <имя_пакета>.rpm





Оставьте комментарий