Модуль 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- открытие следующего потока.
Назначение.Инициализация объекта 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
Пример:
ERASE BaseClose
Назначение.Создает копию соединения.
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() VARIABLE
Назначение.Устанавливает словарь для поиска и сортировки..
Dictionary( STRING<Name> ) BOOL
Name - имя словаря.
Описание.Метод устанавливает рабочий словарь базы, который используется при поиске и сортировки. Необходимость в нем связана с тем, что часть операций поиска выполняется непосредственно модулем RSODBC, а не ODBC драйвером. В результате возможно расхождение по порядку кодов символов используемых модулем и ODBC. В данной версии определено два словаря MSSQL для работы с MSSQL с кодовой страницей 1251 и W1251- нечувствительная к регистру кодовая страница Windows-1251. Для ввода собственного словаря следует составить его кодовую страницу и добавить в ресурс модуля, секцию DICTIONARY под желаемым именем. В директории Dic для примера приводятся оба словаря. Следует обратить внимание, что в подготовленном т.о. словаре при загрузке в ресурс следует обнулить нулевой байт.
Назначение.Протоколирование.
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( 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
Назначение.Инициализация объекта 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
Назначение.Деинециализация объекта RecordSet.
Close
Пример.
SET Rs=Base.New("COUNTRY",10) IF EMPTY(Rs) GOTO CLOSE ... CLOSE: ERASE Rs.Close
Назначение.Отоброзить на экране текст запроса.
ShowQuery( LONG<hWnd> )
hWnd - описатель родительского окна.
Описание.По данной команде на экране будет отображено окно диалога с текстом запроса. Это можно использовать для контроля правильности создания запроса методами PatPut и FldSort.
Назначение.Открыть таблицу.
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( BOOL<On> ) LONG
On - 0-перезапрос будет выполнен только если RecordSet был изменен, 1-в любом случае.
Описание.Метод возвращает кол-во записей в выборке.
Пример:
RecCnt=Rs.Refresh(1)
Назначение.Возвращает кол-во записей в выборке.
RecCnt() LONG
Пример:
RecCnt=Rs.RecCnt()
Назначение.Поиск записи.
Find( STRING<Pattern> ) LONG
Pattern - текстовая строка задающая текст поля записи, которую следует найти в базе. Если запись найдена, то возвращается номер записи в выборке, иначе 0. Имя поля совпадает с полем по которому отсортирована выборка.
Пример:
Rec=Rs.Find("Москва")
Назначение.Поиск записи по части строки.
Seek( STRING<Pattern>, LONG<cbPattern> ) LONG
Pattern - текстовая строка задающая часть текста поля записи,
которую следует найти в базе. Если запись найдена, то возвращается номер записи в выборке,
иначе 0. Имя поля совпадает с полем по которому отсортирована выборка.
Функция работает только по строковым полям.
cbPattern - длинна текста.
Пример:
Rec=Rs.Seek("Мо",2)
Назначение.Установить поле сортировки.
FldSort( STRING<Name> ) BOOL
Name - список полей, разделенных запятой, по которым устанавливается сортировка.
Пример:
ok=Rs.FldSort("DATE,NUMBER")
Назначение.Установить опции поля.
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 0MONEY - объявляет поле типа "MONEY".
w=Rs.FldOption( "NAME", "GET=WIDTH" )
Назначение.Установить подножье таблицы.
Footer( STRING<Name>, VARIABLE<V> ) BOOL
Name - имя поля.
V - значение подножья.
Пример:
ok=Rs.Footer("SUMMA",Sum)
Назначение.Возвращает имя или номер поля.
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( LONG<Rec> ) BOOL
Rec - номер записи.
Описание.Метод возвращает ложь при попытке прочитать уничтоженную или несуществующую запись. Хотя значения полей удаленной записи можно получить.
Пример:
ok=Rs.RecGet(1)
Назначение.Начать редактирование записи.
Edit( LONG<Rec> ) BOOL
Rec - номер редактируемой записи или ноль в случае новой.
Описание.В случае нуля метод сбрасывает буфер записи инициализируя его NULL значениям. Иначе происходит неявный вызов функции RecGet.
Пример:
ok=Rs.Edit(0)
Назначение.Завершить редактирование записи.
Update( LONG<Rec> ) BOOL
Rec - номер редактируемой записи или ноль в случае новой.
Описание.Метод производит запись информации накопленной в буфере в таблицу.
Пример:
Rs.Edit(0) Rs.FldPut("NAME","Hello") IF Rs.Update(0) THEN Rs.Refresh(0)
Назначение.Удалить запись.
Remove( LONG<Rec> ) BOOL
Rec - номер записи.
Пример:
ok=Rs.Remove(1)
Назначение.Получить признак удаленной записи.
Deleted() BOOL
Пример:
ok=Rs.Deleted()
Назначение.Получить номер записи связанной таблицы.
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( STRING<Name> ) VARIABLE
Name - имя поля.
Описание.Метод возвращает содержание поля.
Тип поля | DBasic тип | Примечание |
---|---|---|
char,varchar,longvarchar | STRING | |
numeric,int,smallint | LONG | |
float,real | REAL | |
datetime | LONG | |
datetime | TIME | FldOption("TYPE=TIME") |
bit | BOOL | |
money | MONEY | |
guid | GUID | |
longvarbinary | IMAGE |
Пример:
Rs.RecGet(1) V=Rs.FldGet("NAME")
Назначение.Установить значение поля.
FldPut( STRING<Name>, VARIABLE<V> ) BOOL
Name - имя поля.
V - переменная.
Пример:
Rs.Edit(0) Rs.FldPut("NAME","Hello") IF Rs.Update(0) THEN Rs.Refresh(0)
Назначение.Установить шаблон поиска для поля.
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( STRING<Name> ) VARIABLE
Name - имя поля.
Описание.Для стандартных шаблонов формат возвращаемой строки совпадает с вводимой. Для нестандартных он может быть произвольным.
Пример:
V=Rs.PatGet("NAME")
Назначение.Выполнить запрос.
Execute( STRING<Query> ) BOOL
Query - текст запроса или команды.
Описание.Метод выполняет запрос в синхронном режиме и возвращает TRUE в случае успеха. Для выборки информации из выходного потока следует использовать функции Next, More, Get. Кроме того он может быть использован для передачи команд TABLES- возвращает список таблиц базы, COLUMNS <TABLE>- возвращает список колонок указанной таблицы. Выполнение любого запроса кроме SELECT и SET приводит к открытию новой сессии.
Пример:
ok=Rs.Execute("SELECT * FROM COUNTRY WHERE ID=1")
Назначение.Подготовить запрос.
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( LONG<Num>, VARIABLE<V> ) BOOL
Num - номер параметра (начиная с 1).
V - переменная.
Пример:
ok=Res.Prepare("{CALL CntrSalGet(?,?,?,?)}","4:Out") Res.ParPut(1,Rs.FldGet("ID")) ...
Назначение.Возвращает значение параметра.
ParGet( LONG<Num> ) VARIABLE
Num - номер параметра (начиная с 1).
Описание.Метод возвращает содержание поля.
Тип поля | DBasic тип | Примечание |
---|---|---|
char,varchar,longvarchar | STRING | |
numeric,int,smallint | LONG | |
float,real | REAL | |
datetime | LONG | |
bit | BOOL | |
money | REAL | |
guid | GUID |
Пример:
ok=Res.Prepare("{CALL CntrSalGet(?,?,?,?)}","4:Out") ... Summa=CMONEY(Res.ParGet(4))
Назначение.Выполнить запрос ассинхронно.
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() BOOL
Описание.Метод прекращает выполнение ассинхронного запроса вызванного методом Exec. В этом случае метод Exec возвращает ложь, но никакой диагностики ошибки не происходит.
Пример:
ok=Rep.Cancel()
Назначение.Получение значения поля из потока.
Get( LONG<Num> ) VARIABLE
Num - номер колонки.
Описание.Метод возвращает значение заданной колонки выборки. По неизвестной причине колонки необходимо выбирать строго в порядке возростания номеров, иначе возвращается NULL.Преобразование типов аналогично ParGet.
Пример:
ok=Rep.Execute("SELECT NAME FROM COUNTRY WHERE ID=1") Name=Rep.Get(1)
Назначение.Выборка следующей записи потка.
Next( BOOL<fMore> ) BOOL
fMore - флаг.Если 0, то в случае завершения выборки происходит закрытие потока и т.о. дальнейшая выборка данных из него становится невозможной.
Описание.Метод возвращает TRUE если в потоке еще есть данные и FALSE в противном случае.
Пример:
ok=Rep.Next(1)
Назначение.Открытие следующего потока.
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