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
Оставьте комментарий