odbc.f
Доступ к базам данным через ODBC
Библиотека доступа к базам данным через ODBC написана по следам
библиотеки Андрея
Черезова с таким же названием и схожей функциональностью. Оттуда целиком
взяты некоторые фрагменты кода, относящиеся к доступу к источникам данных,
и оставленые те же имена слов и их стековая нотация.
Различия заключается в самом чтении/записи данных. У Андрея все данные,
каков бы ни был их тип, читаются как строки. Для его задач, в основном,
предполагающих перегрузку данных из базы на веб-страницу, такой подход
удобен и логичен. Однако для программ, выполняющих интенсивные вычисления
и заранее знающих тип своих данных, преобразование данных из строк при
чтении не нужно и,более того, излишне.
1. Установление соединения с базой данных
StartSQL ( -- fodbc ? )
Инициализирует подсистему доступа к БД. Возвращает флаг успешности и
дескриптор соединения.
StopSQL ( fodbc -- )
Разрывает соединение с базой данных и освобождает использованную память.
ConnectSQL ( S" datasource" S" login" S" password" fodbc -- ? )
Устанавливает соединение с конкретным источником данных. Если имя и пароль
не требуются, можно передать на стеке 4 нуля - по два на каждую строку.
2. SQL-запрос к базе и получение информации
ExecuteSQL ( stat fodbc -- ior )
Посылает к базе данных указанный запрос stat. Запрос должен быть
ASCIIZ-строкой. Возвращается код успешности, определяемый драйвером.
SQL_OK? ( ior -- ? )
Проверяет, был ли успешен запрос, вернувший код ior.
ResultCols ( fodbc -- n )
Возвращает число полей в полученных данных (возвращенных оператором SELECT).
AffectedRows ( fodbc -- n )
Возвращает число записей, которые изменились, были добавлены или удалены
в ходе выполнения SQL-запроса (имеет смысл для запросов типа DELETE, UPDATE, INSERT).
ColNumAttribute ( col attr fodbc -- n )
Возвращает числовое значение произвольного атрибута attr колонки (поля) col. Колонки
нумеруются с единицы. Нулевая колонка содержит служебную информацию -
закладку.
ConnectSQL ( buf col attr fodbc -- fodbc ? )
Возвращает в предоставленный буфер buf произвольный атрибут-строку
attr для поля col. Длина буфера (и возвращаемой строки) не
может быть больше 50 байтов.
ColSize ( col fodbc -- n )
Возвращает количество байтов, нужных для хранения поля col.
Например, для целого поля будет возвращено число 4.
ColDisplaySize ( col fodbc -- n )
Возвращает количество байтов, необходимых для представления поля в виде
строки, плюс еще один байт на завершающий нулевой символ. Например, для
целого поля может быть возвращено число 10.
ColType ( col fodbc -- n )
Возвращает константу - тип поля col.
ColCount ( fodbc -- n )
Возвращает количество полей в результирующем наборе данных.
ColName ( buf col fodbc -- )
Возвращает в предоставленный буфер имя поля col.
3. Связывание полей с переменными и чтение данных
BIND ( -- )
Подготавливает данные, необходимые для последующих операций связывания
полей из базы данных с переменными. Связывание выполняется для последнего
запроса, выполненного словом
ExecuteSQL. Для каждого поля
словом типа
SQL_INTEGER ( ->bl; -- )объявляется своя
переменная. Поддерживаются следующие типы:
| Объявляется словом
| Тип переменной
|
| SQL_INTEGER | Целая
|
| SQL_SMALLINT | Маленькая целая
|
| SQL_FLOAT | C плавающей точкой
|
| SQL_DOUBLE | С плавающей точкой двойной длины
|
| SQL_CHAR | ASCIIZ-строка
|
| SQL_BINARY | Произвольные двоичные данные
|
| SQL_BIT | Битовая
|
| SQL_DATE | Дата
|
| SQL_TIME | Время
|
| SQL_TIMESTAMP | Отметка даты/времени
|
Для каждой переменной создается два имени. Например, код
SQL_INTEGER
var создаст две переменных с именами
var и
var#. Первое
имя при вызове вернет значение поля из текущей записи, второе имя - фактическую длину
данных в переменной, выраженную в байтах.
BIND; ( -- )
Разрывает все связи полей с переменными и уничтожает переменные.
ISNULL ( var# -- ? )
Проверяет, не содержит ли указанная переменная, связанная с полем,пустое
значение. Обратите внимание: передается на сама переменная, а ее индикатор
длины.
NextRow ( fodbc -- ? )
Читает очередную запись из результирующего набора данных. Возвращается
флаг - имеется ли следующая запись.
NextRowWithInfo ( fodbc -- ior )
Читает очередную запись, но возвращает код драйвера. Используется для
отладки.
Таблица в базе определена следующим образом:
CREATE TABLE cats(
name CHAR(20),
year INT
);
Распечатать ее значения можно примерно так:
REQUIRE " ~yz/lib/common.f
0 VALUE db
: print-cats
StartSQL 0= IF ." Не могу запустить ODBC" BYE THEN TO db
S" catbase" S" admin" S" pussy" ConnectSQL
0= IF ." Не могу подсоединиться к источнику данных CATBASE" BYE THEN
" SELECT * FROM cats" db ExecuteSQL ?dberror
BIND
SQL_CHAR name
SQL_INT year
BEGIN
db NextRow
WHILE
." Кот " name .ASCIIZ ." родился в " year . ." году" CR
REPEAT
BIND;
db StopSQL ;