Модуль RsODBC


Модуль RSODBC download предназначен для доступа к базе данных через любой ODBC драйвер. Модуль содержит два объекта. Объект BaseSet предназначенный для работы с базой на уровне соединения и объект RecordSet предназначенный для работы с таблицами базы на уровне записей.

К первой группе относятся:
BaseOpen- инициализация объекта BaseSet.
BaseClose- деинициализация объекта.
BaseClone- создает копию соединения.
BaseUser- возвращает идентификатор пользователя.
Dictionary- устанавливает словарь для поиска и сортировки.
BaseLog- протоколирование.
Transaction- начать/завершить транзакцию.

Ко второй:
New- инициализация объекта RecordSet.
Close- деинициализация объекта.
ShowQuery- отображает на экране текст запроса
Open- открывает таблицу.
Refresh- перевызвать запрос.
RecCnt- количество записей в выборке.
Find- поиск записи.
Seek- поиск записи по части строки.
FldSort- установить поля сортировки.
FldOption- установить опции поля.
Footer- установить подножье таблицы.
Field- возвращает номер или имя поля.
RecGet- чтение записи.
Edit- начать редактирование записи.
Update- завершить редактирование записи.
Remove- удалить запись.
Deleted- получить признак удаленной записи.
Link- получить номер записи связанной таблицы.
FldGet- получить значение поля.
FldPut- установить значение поля.
PatPut- установить шаблон поиска для поля.
PatGet- получить шаблон поиска для поля.
Execute- выполнить запрос.
Prepare- подготовить запрос.
ParGet- получить значение параметра.
ParPut- установить значение параметра.
Exec- выполнить запрос ассинхронно.
Cancel- прервать ассинхронный запрос.
Get- получение значения поля из потока.
Next- выборка следующей записи потка.
More- открытие следующего потока.

Список функций

BaseOpen

Назначение.Инициализация объекта BaseSet.

BaseOpen( LONG<hWnd>, STRING<Connect>, LONG<fOption> )LONG<pClass>

hWnd- хэндел окна приложения или 0 в случае его отсутствия. Используется для привязки окна запроса пользователя и пароля к родительскому окну.
CONNECT- строка соединения вида "DSN=BASE; SRV=SERVER; UID=USER; PWD=PASS;", где
DSN-определяет имя базы, SRV- имя сервера (только для клиент.серверных баз), UID- имя пользователя и PWD-его пароль. В случае отсутствия одного из параметров, за исключением SRV он запрашивается через окно диалога.
OPTION- это битовое поле
0- бит определяет тип курсора 0-серверный курсор, 1-ODBC курсор
1- бит. Установка этого бита подавляет выдачу сообщения об ошибке в процессе установления соединения.

Пример:

SET Shop= RSODBC.BaseOpen( HWND, "DSN=NAROD;SRV=ANY;", 0 )
IF EMPTY(Shop) GOTO CLOSE
OPER= Shop.BaseUser()

BaseClose

Назначение.Деинициализация объекта

BaseClose

Пример:

ERASE BaseClose

BaseClone

Назначение.Создает копию соединения.

BaseClone( LONG<hWnd> ) LONG<pClass>

hWnd - описатель родительского окна.

Описание.Метод возвращает копию соединения.

Пример:

SET Base= RSODBC.BaseOpen( HWND, "DSN=NAROD;SRV=ANY;", 0 )
IF EMPTY(Base) GOTO CLOSE
Clone=Base.BaseClone(HWND)
...
CLOSE:
ERASE Clone.BaseClose
ERASE Base.BaseClose

BaseUser

Назначение.Возвращает идентификатор пользователя

BaseUser() VARIABLE

Dictionary

Назначение.Устанавливает словарь для поиска и сортировки..

Dictionary( STRING<Name> ) BOOL

Name - имя словаря.

Описание.Метод устанавливает рабочий словарь базы, который используется при поиске и сортировки. Необходимость в нем связана с тем, что часть операций поиска выполняется непосредственно модулем RSODBC, а не ODBC драйвером. В результате возможно расхождение по порядку кодов символов используемых модулем и ODBC. В данной версии определено два словаря MSSQL для работы с MSSQL с кодовой страницей 1251 и W1251- нечувствительная к регистру кодовая страница Windows-1251. Для ввода собственного словаря следует составить его кодовую страницу и добавить в ресурс модуля, секцию DICTIONARY под желаемым именем. В директории Dic для примера приводятся оба словаря. Следует обратить внимание, что в подготовленном т.о. словаре при загрузке в ресурс следует обнулить нулевой байт.

BaseLog

Назначение.Протоколирование.

BaseLog( STRING<Message> ) BOOL

Message - команда или сообщение.

Описание.Метод выполняет протоколирование. Строка может содежать сообщение или команду. Возможны две команды LOGON=FileName, где FileName полное имя файла протокола и LOGOFF. Первая команда запускает процесс протоколирования всех ошибок работы модуля, вторая завершает процесс протоколирования. Все другие строки рассматриваются как сообщения и просто записываются в файл протокола, если перед этим была выполнена команда LOGON.

Пример:

SET Base= RSODBC.BaseOpen( HWND, "DSN=NAROD;SRV=ANY;", 0 )
IF EMPTY(Base) GOTO CLOSE
ok=Base.BaseLog("LOGON=d:\temp\shop.log")
...
Base.BaseLog("Выполнена операция 1")
...
Base.BaseLog("Выполнена операция 2")
...
Base.BaseLog("LOGOFF")

CLOSE:
ERASE Base.BaseClose

Transaction

Назначение.Начать/завершить транзакцию.

Transaction( STRING<Action> ) BOOL

Action - команда.

Описание.Метод может выполнить три команды:
BEGIN- начать транзакцию,
COMMIT- завершить транзакцию,
ROLLBACK- отменить транзакцию.

Пример:

SET Base= RSODBC.BaseOpen( HWND, "DSN=NAROD;SRV=ANY;", 0 )
IF EMPTY(Base) GOTO CLOSE
...
Err=0
ok=Base.Transaction("BEGIN")
...
IF Err<>0 THEN ok=Base.Transaction("ROLLBACK")
IF Err==0 THEN ok=Base.Transaction("COMMIT")
...
CLOSE:
ERASE Base.BaseClose

New

Назначение.Инициализация объекта RecordSet.

New( OBJECT<Base>, STRING<Name>, LONG<Cash> ) LONG<pClass>

Base - переменная типа BaseSet.
Table -наименование таблицы, в случае ODBC курсора, или произвольный текст в случае серверного курсора. Данный текст используется при выводе окна сообщения об ошибке. В случае использования SQL-базы для подавления системных сообщений ODBC и SQL текст сообщения следует помещать в фигурные скобки, а для переноса текста на новую строку использовать символ вертикальная черта '|'. Например:

RAISERROR( '{Текст сообщения|об ошибке}', 0, -1 )
Table -количество строк таблицы помещаемых в кэш. Размер кэш всегда находится в диапазоне 1.. 60 строк.

Пример:

SET Base= RSODBC.BaseOpen( HWND, "DSN=NAROD;SRV=ANY;", 0 )
IF EMPTY(Base) GOTO CLOSE
...
SET Rs=Base.New("COUNTRY",10)
IF EMPTY(Rs) GOTO CLOSE
...
или
SET Rs=RSODBC.New(Base,"COUNTRY",10)
IF EMPTY(Rs) GOTO CLOSE
...
CLOSE:
ERASE Rs.Close
ERASE Base.BaseClose

Close

Назначение.Деинециализация объекта RecordSet.

Close

Пример.

SET Rs=Base.New("COUNTRY",10)
IF EMPTY(Rs) GOTO CLOSE
...
CLOSE:
ERASE Rs.Close

ShowQuery

Назначение.Отоброзить на экране текст запроса.

ShowQuery( LONG<hWnd> )

hWnd - описатель родительского окна.

Описание.По данной команде на экране будет отображено окно диалога с текстом запроса. Это можно использовать для контроля правильности создания запроса методами PatPut и FldSort.

Open

Назначение.Открыть таблицу.

Open( STRING<Query>, STRING<Cursor> ) BOOL

Query - строка запроса.
Cursor - строка задающая тип курсора "DYNAMIC" - динамический курсор, "KEYSET" - табличный курсор, "STATIC" - статический курсор. Если курсор не указан или указан неверно, то используется "FORWARD_ONLY" курсор.

Пример:

SET Base= RSODBC.BaseOpen( HWND, "DSN=NAROD;SRV=ANY;", 0 )
IF EMPTY(Base) GOTO CLOSE
...
SET Rs=Base.New("COUNTRY",10)
IF EMPTY(Rs) GOTO CLOSE
ok= Rs.Open("SELECT * FROM COUNTRY ORDER BY NAME","KEYSET")
IF NOT ok GOTO CLOSE
...
CLOSE:
ERASE Rs.Close
ERASE Base.BaseClose

Refresh

Назначение.Перевызвать запрос.

Refresh( BOOL<On> ) LONG

On - 0-перезапрос будет выполнен только если RecordSet был изменен, 1-в любом случае.

Описание.Метод возвращает кол-во записей в выборке.

Пример:

RecCnt=Rs.Refresh(1)

RecCnt

Назначение.Возвращает кол-во записей в выборке.

RecCnt() LONG

Пример:

RecCnt=Rs.RecCnt()

Find

Назначение.Поиск записи.

Find( STRING<Pattern> ) LONG

Pattern - текстовая строка задающая текст поля записи, которую следует найти в базе. Если запись найдена, то возвращается номер записи в выборке, иначе 0. Имя поля совпадает с полем по которому отсортирована выборка.

Пример:

Rec=Rs.Find("Москва")

Seek

Назначение.Поиск записи по части строки.

Seek( STRING<Pattern>, LONG<cbPattern> ) LONG

Pattern - текстовая строка задающая часть текста поля записи, которую следует найти в базе. Если запись найдена, то возвращается номер записи в выборке, иначе 0. Имя поля совпадает с полем по которому отсортирована выборка. Функция работает только по строковым полям.
cbPattern - длинна текста.

Пример:

Rec=Rs.Seek("Мо",2)

FldSort

Назначение.Установить поле сортировки.

FldSort( STRING<Name> ) BOOL

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

Пример:

ok=Rs.FldSort("DATE,NUMBER")

FldOption

Назначение.Установить опции поля.

FldOption( STRING<Name>, STRING<Option> ) LONG

Name - имя поля. Если в качестве имени поля вводится цифра (например "1"), то она рассматривается как номер поля. Если номер поля равен 0, то операция (если это допустимо) рассматривается как групповая, т.е. применимая ко всем полям таблицы.
Name - строка опций. Опции могут следовать одна за другой и разделяются точкой с запятой. Например: WIDTH=12;TYPE=CHAR;MODE=VIRTUAL

Описание.Допустимы следующие опции:
WIDTH - устанавливает видимую ширину колонки в символах. Например:

Rs.FldOption( "NAME", "WIDTH=12" )
TYPE - изменяет тип поля. Возможны варианты: Numeric, Float, Date, Time, Char. В случае Float цифра после символа "F" определяет количество отображаемых знаков после запятой. Например:
Rs.FldOption( "NAME", "TYPE=F2" )
MODE - определяет вид отображения поля. Возможны варианты: HIDE - поле не отображается, FULL - поле отображается полностью, VIRTUAL - определяет поле виртуальным, т.е. отсутствующим в реальной таблице. При этом для отображения поля RSODBC генерирует событие с кодом задаваемым опцией EVENT, передовая в качестве параметра указатель на буфер. Для его заполнения следует воспользоваться функцией MCOPY. Выход из события dBasic должен обязательно завершаться кодом возврата 0-для выравнивания результата по левому краю и 1- по правому. Например:
Rs.FldOption( "STATUS", "WIDTH=4;MODE=VIRTUAL;EVENT=4000" )
EVENT 4000,STATUS
…

STATUS:
 Temp= Rs.FldGet("STATUS")
 IF Temp="N" THEN RES= MCOPY( PARAM, TYPE(0) )
 IF Temp="O" THEN RES= MCOPY( PARAM, TYPE(1) )
END 0
MONEY - объявляет поле типа "MONEY".
PRINT - подавляет печать колонки в текстовых формах.
EVENT - определяет код события (см. выше).

GET - возвращает один из параметров колонки. EDIT - возвращает 1 если редактирование колонки допустимо и 0- иначе. Опция работает если функция поддержина драйвером ODBC, иначе всегда 1. WIDTH - видимая ширина колонки. DEC - количество отображаемых дробных знаков. SIZE - ширина колонки в символах. INC - 1-колонка является автоинкремируемой, иначе нет. Например:
w=Rs.FldOption( "NAME", "GET=WIDTH" )

Footer

Назначение.Установить подножье таблицы.

Footer( STRING<Name>, VARIABLE<V> ) BOOL

Name - имя поля.
V - значение подножья.

Пример:

ok=Rs.Footer("SUMMA",Sum)

Field

Назначение.Возвращает имя или номер поля.

Field( STRING<Name> ) VARIABLE

Name - имя или номер поля.

Описание.В случае если в качестве параметра передается имя поля, то метод возвращает его номер, или 0 - если поле не найдено. Если передать строку начинающуюся с числа, то строка рассматривается как номер поля и метод возвращает имя поля или NULL, если номер не верен.

Пример:

Col=Tbl.Column()
Name=ITEM(Rs.Field(STR(Col)),",",1)
Fi=VAL(MID(Name,3))
sPos=MID(Name,1,2)

RecGet

Назначение.Получить запись.

RecGet( LONG<Rec> ) BOOL

Rec - номер записи.

Описание.Метод возвращает ложь при попытке прочитать уничтоженную или несуществующую запись. Хотя значения полей удаленной записи можно получить.

Пример:

ok=Rs.RecGet(1)

Edit

Назначение.Начать редактирование записи.

Edit( LONG<Rec> ) BOOL

Rec - номер редактируемой записи или ноль в случае новой.

Описание.В случае нуля метод сбрасывает буфер записи инициализируя его NULL значениям. Иначе происходит неявный вызов функции RecGet.

Пример:

ok=Rs.Edit(0)

Update

Назначение.Завершить редактирование записи.

Update( LONG<Rec> ) BOOL

Rec - номер редактируемой записи или ноль в случае новой.

Описание.Метод производит запись информации накопленной в буфере в таблицу.

Пример:

Rs.Edit(0)
Rs.FldPut("NAME","Hello")
IF Rs.Update(0) THEN Rs.Refresh(0)

Remove

Назначение.Удалить запись.

Remove( LONG<Rec> ) BOOL

Rec - номер записи.

Пример:

ok=Rs.Remove(1)

Deleted

Назначение.Получить признак удаленной записи.

Deleted() BOOL

Пример:

ok=Rs.Deleted()

Link

Назначение.Получить номер записи связанной таблицы.

Link( STRING<RsID>, STRING<RsName>, OBJECT<Link>, STRING<LnkID> ) LONG

RsID - набор полей FOREIGN KEY основной таблицы.
RsName - значение поля раскрытое по связанной таблице.
Link - связанная таблица.
LnkID - PRIMARY KEY связанной таблицы.

Описание.Метод возвращает номер записи связанной таблицы или 0 если не найдено.

Пример:

SET Rs=Base.New("NAC",10)
Rs.Open("SELECT P.NAME AS PNAME, N.PRVID, N.PRVFI FROM NAC N, PROV P WHERE N.PRVID=P.ID AND N.PRVFI=P.FI","KEYSET")
SET Prv=Base.New("PROV",10)
Prv.Open("SELECT NAME, ID, FI FROM PROV ORDER BY NAME","KEYSET")
...
PrvId=Rs.Link( "PRVID|PRVFI", "PNAME", Prv, "ID|FI" )
PUT 102,PrvId,Prv.RecCnt(),3005

FldGet

Назначение.Возвращает значение поля.

FldGet( STRING<Name> ) VARIABLE

Name - имя поля.

Описание.Метод возвращает содержание поля.
Тип поляDBasic типПримечание
char,varchar,longvarcharSTRING 
numeric,int,smallintLONG 
float,realREAL 
datetimeLONG 
datetimeTIMEFldOption("TYPE=TIME")
bitBOOL 
moneyMONEY 
guidGUID 
longvarbinaryIMAGE 

Пример:

Rs.RecGet(1)
V=Rs.FldGet("NAME")

FldPut

Назначение.Установить значение поля.

FldPut( STRING<Name>, VARIABLE<V> ) BOOL

Name - имя поля.
V - переменная.

Пример:

Rs.Edit(0)
Rs.FldPut("NAME","Hello")
IF Rs.Update(0) THEN Rs.Refresh(0)

PatPut

Назначение.Установить шаблон поиска для поля.

PatPut( STRING<Name>, VARIABLE<V> ) BOOL

Name - имя поля.
V - переменная.

Описание.Шаблон представляет собой текст и трактуется в зависимости от типа поля. Для текстовых полей это может быть полный текст или часть текста поля. В последнем случае следует использовать символ заместитель "%". Функция добавляет в секцию WHERE запроса тест вида NAME='nnnn' или NAME LIKE 'nnn%'. Для цифровых полей это просто цифра, а для задания интервала используется выражение вида "1.2=100.5". Функция добавляет в секцию WHERE запроса тест вида NAME=nn или NAME BETWEEN nn1 AND nn2. Для полей дат, используется аналогичный синтексис, а сама дата задается в виде последовательности DD/MM/YY. Порядок следования, определяется форматом даты, установленном в Windows. В качестве разделителя можно использовать любой не цифровой символ. Для задания не стандартных шаблонов их следует помещать в фигурные скобки. Например текст "{ & 1<>0}" будет интерпретирован как NAME & 1 <> 0. Для удаления шаблона следует передать пустую строку.

Пример:

ok=Rs.PatPut("NAME","133%")

PatGet

Назначение.Получить шаблон поиска для поля..

PatGet( STRING<Name> ) VARIABLE

Name - имя поля.

Описание.Для стандартных шаблонов формат возвращаемой строки совпадает с вводимой. Для нестандартных он может быть произвольным.

Пример:

V=Rs.PatGet("NAME")

Execute

Назначение.Выполнить запрос.

Execute( STRING<Query> ) BOOL

Query - текст запроса или команды.

Описание.Метод выполняет запрос в синхронном режиме и возвращает TRUE в случае успеха. Для выборки информации из выходного потока следует использовать функции Next, More, Get. Кроме того он может быть использован для передачи команд TABLES- возвращает список таблиц базы, COLUMNS <TABLE>- возвращает список колонок указанной таблицы. Выполнение любого запроса кроме SELECT и SET приводит к открытию новой сессии.

Пример:

ok=Rs.Execute("SELECT * FROM COUNTRY WHERE ID=1")

Prepare

Назначение.Подготовить запрос.

Prepare( STRING<Query>, STRING<Option>) BOOL

Query - текст запроса или команды.
Option -опции запроса.

Описание.Метод выполняет подготовку для выполнения запроса. Для фактического выполнения запроса следует выполнить метод Execute c параметром 0. Если в качестве запроса используется вызов функции, то происходит подготовка буферов для чтения и записи ее параметров. Вид параметра определяется строкой опций, в которой через запятую перечисляются номер параметра и его вид In-входной, Out-выходной, Ext-входной и выходной. Например:1:Out,2:Ext. По умолчанию все параметры считаются входными.

Пример:

SET Res= RSODBC.New( Shop, "sql\CntrSalGet.sql", 1 )
IF EMPTY(Res) THEN END
ok=Res.Prepare("{CALL CntrSalGet(?,?,?,?)}","4:Out")
...
Res.ParPut(1,Rs.FldGet("ID"))
Res.ParPut(2,Rs.FldGet("FI"))
Res.ParPut(3,Name)
ok=Res.Execute(0)
Summa=CMONEY(Res.ParGet(4))
...
ERASE Res.Close

ParPut

Назначение.Установить значение параметра.

ParPut( LONG<Num>, VARIABLE<V> ) BOOL

Num - номер параметра (начиная с 1).
V - переменная.

Пример:

ok=Res.Prepare("{CALL CntrSalGet(?,?,?,?)}","4:Out")
Res.ParPut(1,Rs.FldGet("ID"))
...

ParGet

Назначение.Возвращает значение параметра.

ParGet( LONG<Num> ) VARIABLE

Num - номер параметра (начиная с 1).

Описание.Метод возвращает содержание поля.
Тип поляDBasic типПримечание
char,varchar,longvarcharSTRING 
numeric,int,smallintLONG 
float,realREAL 
datetimeLONG 
bitBOOL 
moneyREAL 
guidGUID 

Пример:

ok=Res.Prepare("{CALL CntrSalGet(?,?,?,?)}","4:Out")
...
Summa=CMONEY(Res.ParGet(4))

Exec

Назначение.Выполнить запрос ассинхронно.

Exec( LONG<hWnd>, LONG<Event>, STRING<Query> ) BOOL

hWnd - описатель родительского окна.
Event - код события.
Query - текст запроса.

Описание.Метод выполняет запрос в асинхронном режиме и возвращает TRUE в случае успеха. Для выборки информации из выходного потока следует использовать функции Next, More, Get. В случае если HWND и EVENT не равных нулю метод генерирует событие с заданным кодом каждые 200 мс. Для прекращения выполнения запроса следует использовать метод Cancel.

Пример:

EVENT $EKEY,KEYDOWN 
EVENT $EPAINT,PAINT
EVENT 3000,CALC 
Start=TIME(-1)
ok=Rep.Exec( HWND, 3000, SQLSTR	 )
EVENT 1008 
EVENT $EPAINT
EVENT 3000

IF NOT ok GOTO CLOSE

…
KEYDOWN:
 IF PARAM=27 THEN RES=Rep.Cancel()
END 

PAINT:
 NewFont= FONT( HDC, "Pragmatica", 40, "BOLD" )
 OldFont= GDI32!SelectObject( HDC, NewFont )
 GDI32!SetTextColor( HDC, RGB(0,0,255) )
 GDI32!TextOutA( HDC, 0, 0, TIME(TIME(-1)-Start), 8 )
 GDI32!SelectObject( HDC, OldFont )
 GDI32!DeleteObject( NewFont )
END

CALC:
 USER32!InvalidateRect( HWND, 0, 0 )
END

Cancel

Назначение.Прекратить выполнение запроса.

Cancel() BOOL

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

Пример:

ok=Rep.Cancel()

Get

Назначение.Получение значения поля из потока.

Get( LONG<Num> ) VARIABLE

Num - номер колонки.

Описание.Метод возвращает значение заданной колонки выборки. По неизвестной причине колонки необходимо выбирать строго в порядке возростания номеров, иначе возвращается NULL.Преобразование типов аналогично ParGet.

Пример:

ok=Rep.Execute("SELECT NAME FROM COUNTRY WHERE ID=1")
Name=Rep.Get(1)

Next

Назначение.Выборка следующей записи потка.

Next( BOOL<fMore> ) BOOL

fMore - флаг.Если 0, то в случае завершения выборки происходит закрытие потока и т.о. дальнейшая выборка данных из него становится невозможной.

Описание.Метод возвращает TRUE если в потоке еще есть данные и FALSE в противном случае.

Пример:

ok=Rep.Next(1)

More

Назначение.Открытие следующего потока.

More( BOOL<fMore> ) BOOL

fMore - флаг.Если 0, то в случае завершения выборки происходит закрытие потока и т.о. дальнейшая выборка данных из него становится невозможной.

Описание.Метод возвращает TRUE если в потоке еще есть данные и FALSE в противном случае.

Пример:

SET Rep=RSODBC.New( Base, "sql\repVedAllSch.sql", 1 )
IF EMPTY(Rep) GOTO CLOSE
ok=Rep.Execute( "EXEC repVedAllSch "+SQLSTR )
RecCnt=Rep.Get(1)
...
Rep.More(0)
READNEXT:
V1=Rep.Get(1)
V2=Rep.Get(1)
IF Rep.Next(0) GOTO READNEXT
...
ERASE Rep.Close

Hosted by uCoz