SQL-функции в Microsoft Visual FoxPro
« Назад Функция SQLCONNECT([nStatementHandle])или SQLCONNECT([cConnectionName | cDataSourceName [, cUserID
|
cSetting |
Тип |
Описание |
Статус |
"Asynchronous" |
L |
См. табл. 14.15 |
Чтение / |
"BatchMode" |
L |
Если равно .T. (по умолчанию), то SQLEXEC( ) возвращает все результаты сразу, или порциями посредством SQLMORERESULTS( ), если равно .F. |
" |
"ConnectBusy" |
L |
Содержит .T., если разделяемое соединение занято, или .F. – в противном случае |
Чтение |
"ConnectString" |
C |
См. табл. 14.15 |
" |
"ConnectTimeout" |
N |
" |
Чтение / |
"DataSource" |
C |
" |
" |
DisconnectRollback |
L |
" |
" |
"DispLogin" |
N |
" |
" |
"DispWarnings" |
L |
" |
" |
"IdleTimeout" |
N |
" |
" |
"ODBChdbc" |
N |
Внутренний ODBC-идентификатор соединения, который может быть использован внешней библиотекой файлов (FLL-файлы) для вызова ODBC |
Чтение |
"ODBChstmt" |
N |
Внутренний ODBC-идентификатор SQL-соединения, который может быть использован внешней библиотекой файлов (FLL-файлы) для вызова ODBC |
" |
"PacketSize" |
N |
См. табл. 14.15 |
Чтение / |
"PassWord" |
C |
" |
Чтение |
"QueryTimeout" |
N |
" |
Чтение / |
"Shared" |
L |
Содержит .T., если соединение разделяемое, или .F. – в противном случае |
Чтение |
"Transactions" |
N |
См. табл. 14.15 |
Чтение / |
"UserId" |
C |
" |
Чтение |
"WaitTime" |
N |
" |
Чтение / |
eExpression – значение свойства. Тип значения должен совпадать с типом свойства. Если параметр eExpression опущен, то восстанавливается заданное по умолчанию значение.
Свойства задаются как на уровне VFP в проектировщике соединений (см. рис. 16.4), так и на уровне соединения. Исключение составляет свойство ConnectTimeOut, существующее только на уровне VFP. Значение свойства, заданное на уровне VFP в проектировщике соединений или функцией DBSETPROP( ), берется как значение по умолчанию на уровне соединения при его создании на основе именованного соединения базы данных VFP.
Пример. Изменяется значение свойства IdleTimeout.
&& Неразделяемое SQL-соединение; указываем ODBC-имя источника данных
nStHandle = SQLConnect('BookSaleDataBase')
if nStHandle > 0 then
MessageBox('SQL-соединение создано!')
nSet = SQLSetProp(nStHandle, "IdleTimeout", 2)
if nSet > 0 then
&& Получаем и выводим значение свойства IdleTimeout SQL-соединения
? SQLGetProp(nStHandle, "IdleTimeout") && Напечатает: 2
&& Получаем и выводим значение свойства IdleTimeout окружения
? SQLGetProp(0, "IdleTimeout") && Напечатает: 0
else
MessageBox("Ошибка при задании IdleTimeout")
endif
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
else
MessageBox('Не удалось создать SQL-соединение')
endif
Функция
SQLGETPROP(nStatementHandle, cSetting)
возвращает значение свойства заданного параметром nStatementHandle SQL-соединения.
Результат и параметр nStatementHandle функции описаны в разд. 16.3.3. Правда, если качестве nStatementHandle указать 0, то SQLGETPROP( ) вернет значение соответствующей установки окружения.
Параметр:
cSetting – строка с именем свойства, значение которого нужно получить. Возможные значения cSetting см. в табл. 16.7.
Функция
SQLTABLES(nStatementHandle [, cTableTypes] [, cCursorName])
заносит сведения о таблицах источника данных SQL-соединения, заданного параметром nStatementHandle, в курсор VFP.
Функция может выполняться в асинхронном режиме.
Результат и параметр nStatementHandle функции описаны в разд. 16.3.3 и 16.3.4.
Параметры:
cTableTypes – один или более типов таблиц. Возможные значения типа таблицы: 'TABLE', 'VIEW' и 'SYSTEM TABLE'. При задании нескольких типов их значения разделяются запятыми, например:
? SQLTables(nStHandle, "'VIEW', 'SYSTEM TABLE'", "SomeCur")
Если параметр cTableTypes опущен или равен пустой строке, то выберутся имена таблиц всех типов.
Значение типа таблицы задается прописными буквами и обрамляется одинарными кавычками, например "'TABLE'". Внешние или внутренние кавычки могут быть опущены, если cTableTypes содержит один тип, например:
? SQLTables(nStHandle, "TABLE", "SomeCur")
cCursorName – имя курсора VFP, в который посылаются результаты. Если параметр опущен, то будет использовано имя по умолчанию – SQLResult.
Курсор содержит приведенные в табл. 16.8 столбцы.
Таблица 16.8
Столбцы курсора, создаваемого SQLTABLES( )
Имя столбца |
Описание |
Table_cat |
Каталог таблицы |
Table_schem |
Схема таблицы |
Table_name |
Имя таблицы, взятое из словаря данных |
Table_type |
Тип таблицы ('TABLE', 'VIEW' или 'SYSTEM TABLE') |
Remarks |
Описание таблицы |
Пример. Выводится информация о таблицах ODBC-источника данных BookSaleDataBase.
&& Неразделяемое SQL-соединение; указываем ODBC-имя источника данных
&& По умолчанию имеем синхронное соединение
nStHandle = SQLConnect('BookSaleDataBase')
if nStHandle > 0 then
MessageBox('SQL-соединение создано!')
nResult = SQLTables(nStHandle, 'TABLE', "BookSaleCur")
if nResult = 1 then
&& Отображаем курсор BookSaleCur
&& Результат приведен на рис. 16.11
browse last
else
MessageBox("Ошибка при выполнении SQLTables")
endif
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
else
MessageBox('Не удалось создать SQL-соединение')
endif
Рис. 16.11. Результат, полученный SQLConnect( )
Функция
SQLCOLUMNS(nStatementHandle, cTableName
[, "FOXPRO" | "NATIVE"] [, cCursorName])
заносит имена столбцов (полей) таблицы SQL-соединения, указанного параметром nStatementHandle, и информацию о ее столбцах в курсор VFP.
Функция может выполняться в асинхронном режиме.
Результат и параметр nStatementHandle функции описаны в разд. 16.3.3 и 16.3.4.
Если cTableName задает несуществующее имя таблицы и использован параметр "NATIVE", то функция вернет 1 и сформирует пустой курсор. Если же употреблен параметр "FOXPRO", то функция вернет –1, курсор не создается.
Параметры:
cTableName – имя таблицы. Может содержать символы ? и *.
"FOXPRO" | "NATIVE" – формат информации о столбцах. Если указано значение "NATIVE", то формат сведений будет таким же, как и в источнике данных. В противном случае (по умолчанию) употребляется формат VFP.
cCursorName – имя курсора VFP, в который посылаются результаты. Если параметр опущен, то будет использовано имя по умолчанию – SQLResult.
Имена столбцов результирующего курсора в формате "FOXPRO" приведены в табл. 16.9, а в формате "NATIVE" – в табл. 16.10.
Таблица 16.9
Имена столбцов курсора в формате "FOXPRO"
Имя столбца |
Описание |
Field_name |
Имя столбца |
Field_type |
Тип поля |
Field_len |
Длина поля |
Field_dec |
Число десятичных знаков |
Таблица 16.10
Имена столбцов курсора в формате "NATIVE"
Имя столбца |
Описание |
Table_cat |
Каталог таблицы |
Table_schem |
Схема таблицы |
Column_name |
Имя столбца |
Data_type |
Тип поля |
Type_name |
Имя типа поля |
Decimal_digits |
Число десятичных знаков |
Buffer_length |
Размер буфера |
Scale |
Коэффициент масштабирования данных |
Num_prec_radix |
Основание системы счисления (для числовых данных) |
Nullable |
Поддержка NULL-значений |
Remarks |
Описание столбца |
Замечание. В зависимости от источника данных в результат могут быть включены дополнительные, не указанные в табл. 16.10 столбцы.
Пример. Выводятся сведения о столбцах таблицы Authors базы данных BookSale.mdb источника данных BookSaleDataBase. Результат приводится как в "FOXPRO", так и в "NATIVE"-формате.
&& Создаем неразделяемое SQL-соединение; указываем ODBC-имя источника данных
&& По умолчанию имеем синхронное соединение
nStHandle = SQLConnect('BookSaleDataBase')
if nStHandle > 0 then
MessageBox('SQL-соединение создано!')
&& Формат "FOXPRO"
nResult = SQLColumns(nStHandle, "Authors", 'FOXPRO', "BookSaleAuthorsCur")
&& Формат "NATIVE"
* nResult = SQLColumns(nStHandle, "Authors", "NATIVE", "BookSaleAuthorsCur")
if nResult = 1 then
&& Отображаем курсор BookSaleAuthorsCur
&& Результат приведен на рис. 16.12 и рис. 16.13
browse last
else
MessageBox("Ошибка при выполнении SQLColumns")
endif
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
else
MessageBox('Не удалось создать SQL-соединение')
endif
Рис. 16.12. Сведения о столбцах таблицы Authors в формате "FOXPRO"
Рис. 16.13. Одна запись курсора BookSaleAuthorsCur в формате "NATIVE"
Функция
SQLEXEC(nStatementHandle, [cSQLCommand, [cCursorName [, aCountInfo]]])
посылает источнику данных SQL-оператор, где он выполняется. Если вызывается для исполнения SQL-оператора, подготовленного функцией SQLPREPARE( ), то только инициирует его выполнение и осуществляет получение результатов.
Функция может выполняться в асинхронном режиме.
Результат и параметр nStatementHandle функции описаны в разд. 16.3.3 и 16.3.4.
Параметры:
cSQLCommand – SQL-оператор, передаваемый источнику данных.
SQL-оператор может содержать опцию WHERE. Все параметры WHERE должны быть определены до вызова SQLEXEC( ) или SQLPREPARE( ).
В SQL-оператор можно включить выражения. VFP оценивает все выражения до передачи их источнику данных. Выражение, имеющее знаки операций, заключается в круглые скобки.
Если SQL-оператор содержит более 255 символов (включая пробелы), то его текст нужно разбить на несколько строк, объединенных знаком конкатенации. Каждая строка не должна превышать 255 символов, например:
cSQLCommand = "SELECT <список полей> " ;
+ " FROM <список таблиц> " ;
+ " WHERE <выражение фильтра>")
SQL-оператор может содержать SQL-команды DELETE, INSERT, SELECT и UPDATE, а также команду PROCEDURE.
cCursorName – имя курсора, в который VFP заносит результаты. Если параметр не задан, то будет использовано имя по умолчанию – SQLResult. В случае нескольких результатов, получаемых во время выполнения запроса в асинхронном режиме (см. пример для SQLMORERESULTS( )), имя нового курсора образуется путем прибавления номера результат к имени cCursorName.
aCountInfo – задает имя массива, заполняемого информацией о числе доставленных записей. Если массив не существует, то он будет создан. Массив имеет 2 столбца, условно называемых Alias и Count. Описание массива дано в табл. 16.11.
Таблица 16.11.
Состав массива aCountInfo
Столбец |
Содержимое |
Тип данных |
Описание |
Alias |
0 |
Character |
Означает, что SQL-команда не вернула результата: либо не выбрано никаких записей, либо возникла ошибка. Может быть только в 1-й строке. Значение в столбце Count равно –1 |
"" |
Не пустая строка (в верхнем регистре) |
"" |
Псевдоним полученного курсора. Столбец Count содержит число доставленных записей или –1, если доставка записей пока не выполнена. Если Count содержит 1, то курсор может быть еще не создан. Во время асинхронного выполнения запроса процесс доставки может быть поделен между несколькими SQLMORERESULTS или SQLEXEC-вызовами; каждый из них возвращает свое значение для столбца Count |
"" |
Пустая строка |
"" |
Означает, что SQL-команда (INSERT, UPDATE или DELETE) не вернула результата |
Count |
Число задействованных или доставленных записей или –1, если результат не доставлен |
Integer |
Такое же значение возвращает ODBC-функция SQLRowCount( ) |
Пример. Выбираются данные из таблицы Publishers источника данных BookSaleDataBase.
nStHandle = SQLConnect('BookSaleDataBase')
&&
&& Параметры опции WHERE
st1 = "NY"
st2 = "CA"
&&
&& Текст запроса
StmtStr = 'select Name, City, State from Publishers ' ;
+ ' where State = ?st1 or State = ?st2' ;
+ ' order by State'
&&
&& Выполнение запроса
nResult = SQLExec(nStHandle, StmtStr, "Publishers")
if nResult = 1 then
&& Отображаем курсор Publishers
&& Результат приведен на рис. 16.14
browse last
else
MessageBox("Ошибка при выполнении запроса")
endif
&&
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
Рис. 16.14. Фрагмент курсора Publishers
Функция
SQLPREPARE(nStatementHandle, cSQLCommand, [cCursorName])
подготавливает SQL-оператор для удаленного выполнения функцией SQLEXEC( ).
Функция SQLPREPARE( ) посылает источнику данных SQL-оператор, где он компилируется для более быстрого исполнения. После компиляции SQL-оператор может быть выполнен SQLEXEC( ). Функция SQLEXEC( ) вызывается для выполнения SQL-оператора, подготовленного SQLPREPARE( ), с одним параметром – nStatementHandle.
Результат и параметр nStatementHandle функции описаны в разд. 16.3.3.
Прочие параметры см. в описании функции SQLEXEC( ).
Пример. Тот же, что и для функции SQLEXEC( ). Параметры опции WHERE определяются в тексте запроса.
nStHandle = SQLConnect('BookSaleDataBase')
&&
&& Текст запроса
StmtStr = 'select Name, City, State from Publishers ' ;
+ ' where State = ?"NY" or State = ?"CA" order by State'
&&
&& Подготовка запроса
nResult = SQLPrepare(nStHandle, StmtStr, "Publishers")
if nResult = 1 then
SQLExec(nStHandle") && Выполнение запроса
browse last && Просмотр результата
else
MessageBox("Ошибка при подготовке запроса")
endif
&&
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
Пример текста запроса с выражением:
StmtStr = 'select Name, City, State from Publishers ' ;
+ ' where State = ?("N" + "Y") or State = ?"CA" order by State'
Пример текста запроса с функцией в списке полей:
StmtStr = 'select Left(Name, 10) as Name10, City, State from Publishers ' ;
+ ' where State = ?"NY" OR State = ?"CA" order by State'
При такой организации SQL-запроса LEFT(Name, 10) выбирается как memo-поле.
Функция
SQLMORERESULTS(nStatementHandle [, cCursorName [, aCountInfo]])
копирует дополнительные результаты запроса к источнику данных (если таковые имеются) в курсор VFP.
Функция может выполняться в асинхронном режиме.
Результат и параметр nStatementHandle функции описаны в разд. 16.3.3 и 16.3.4. Назначение параметров cCursorName и aCountInfo см. в описании функции SQLEXEC( ). Дополнительно сообщим, что функция возвращает 0, если SQL-оператор все еще выполняется, возвращает 1, если он завершил выполнение, и возвращает 2, если все данные выбраны.
Функция SQLMORERESULTS( ) употребляется, когда свойство соединения BatchMode имеет значение .F. (результаты SQL-запроса возвращаются порциями).
Функция вызывается после успешного вызова SQLEXEC( ) до тех пор, пока SQLMORERESULTS( ) не вернет 2.
Пример (для SQL-сервера). Значение свойства BatchMode устанавливается в .F. Для получения результата используются функция SQLEXEC( ) и неоднократно функция SQLMORERESULTS( ).
nStHandle = SQLConnect('BookSaleDataBase')
&&
&& Получаем результаты порциями
SQLSetProp(nStHandle, 'BatchMode', .F.)
&&
&& Выполняем 3 запроса, передавая их одной функцией SQLEXEC( )
=SQLExec(nStHandle, 'create procedure MyProcedure as ;
select * from Sales; select * from Authors ;
select * from Titles')
=SQLExec(nStHandle, 'execute MyProcedure')
if nResult > 0 then
&&
&& Получаем данные, выбранные 1-м SQL-оператором
SQLMoreResults(nStHandle)
browse last nowait && Просмотр результата
&& Получаем данные, выбранные 2-м и 3-м SQL-операторами
SQLMoreResults(nStHandle)
browse last nowait
SQLMoreResults(nStHandle)
browse last
else
MessageBox("Ошибка при выполнении запроса")
&& Получаем и выводим сведения об ошибке
Aerror(errArray)
display memory like errArray
endif
&&
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
Функция
SQLCOMMIT(nStatementHandle)
завершает транзакцию, в результате которой модифицируются таблицы источника данных.
Функция применяется, если установлен режим программного управления транзакциями.
Параметр и результат функции описаны в разд. 16.3.3.
Пример. Добавляются две записи в таблицу Publishers источника данных BookSaleDataBase.
nStHandle = SQLConnect('BookSaleDataBase')
&&
&& Устанавливаем режим программного управления транзакциями
SQLSetProp(nStHandle, 'Transactions', 2)
&&
&& Выполняем SQL-операторы
nResult1 = SQLExec(nStHandle, "insert into Publishers (PubID, Name, [Company Name]) ;
values (301, 'Новый издатель 1', 'Компания 1')")
nResult2 = SQLExec(nStHandle, "insert into Publishers (PubID, Name, [Company Name]) ;
values (302, 'Новый издатель 2', 'Компания 2')")
if nResult1 + nResult2 = 2 then
&& Завершаем транзакцию
SQLCommit(nStHandle)
&& Выбираем данные для просмотра
SQLExec(nStHandle, 'select * from Publishers where PubID >= 300')
&& Результат приведен на рис. 16.15
browse last
else
MessageBox("Ошибка при выполнении SQL-оператора")
endif
&&
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
Рис. 16.15. Новые записи в Publishers
Замечание. Поле, в имени которого имеются пробелы, заключается в квадратные скобки, например [Company Name].
Функция
SQLROLLBACK(nStatementHandle)
отменяет изменения в таблицах источника данных, выполненные во время текущей, еще незавершенной транзакции.
Функция применяется, если установлен режим программного управления транзакциями. Удаленной таблице могут быть посланы несколько обновлений. Все они могут быть затем отменены SQLROLLBACK( ). Вызов функции выполняется до выполнения SQLCOMMIT( ): транзакцию, завершенную функцией SQLCOMMIT( ), функция SQLROLLBACK( ) отменить не может.
Параметр и результат функции описаны в разд. 16.3.3.
Пример. Отменяются обновления таблицы Publishers источника данных BookSaleDataBase.
nStHandle = SQLConnect('BookSaleDataBase')
&&
&& Устанавливаем режим программного управления транзакциями
SQLSetProp(nStHandle, 'Transactions', 2)
&&
&& Выполняем SQL-операторы
nResult1= SQLExec(nStHandle, "insert into Publishers (PubID, Name, [Company Name]) ;
values (303, 'Новый издатель 3', 'Компания 3')")
nResult2= SQLExec(nStHandle, "insert into Publishers (PubID, Name, [Company Name]) ;
values (304, 'Новый издатель 4', 'Компания 4')")
if nResult1 + nResult2 = 2 then
&& Отменяем обновления
SQLRollBack(nStHandle)
&& Выбираем данные для просмотра
SQLExec(nStHandle, 'select * from Publishers where PubID >= 300')
&& Просмотр результата
browse last
else
MessageBox("Ошибка при выполнении SQL-оператора")
endif
&&
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
Функция
SQLCANCEL(nStatementHandle)
прерывает выполнение посланного источнику данных SQL-оператора.
Функция SQLCANCEL( ) прерывает выполнение функций SQLCOLUMNS( ), SQLEXEC( ), SQLMORERESULTS( ) и SQLTABLES( ), если они работают в асинхронном режиме.
Параметр и результат функции описаны в разд. 16.3.3.
Пример. Прерывает SQL-оператора функции SQLEXEC( ). Режим выполнения функции – асинхронный.
nStHandle = SQLConnect('BookSaleDataBase')
&&
&& Устанавливаем асинхронный режим
SQLSetProp(nStHandle, 'Asynchronous', .T.)
&&
&& Выполняем запрос
SQLExec(nStHandle, 'select * from Publishers')
&&
&& Прерываем SQLExec( )
if SQLCancel(nStHandle) < 0 then
MessageBox("Не удалось прервать SQL-оператор")
&& Получаем и анализируем ошибку
Aerror(errArray)
display memory like errArray
endif
&&
&& Разрываем SQL-соединение
SQLDisconnect(nStHandle)
Замечание. Функция SQLCANCEL( ) не успеет прервать быстро выполняемый SQL-оператор.