Распечатать страницу

SQL-функции в Microsoft Visual FoxPro

« Назад

Функция

SQLCONNECT([nStatementHandle])

или

SQLCONNECT([cConnectionName | cDataSourceName [, cUserID
                  
[, cPassword ]] [, lShared]])

устанавливает SQL-соединение с источником данных. Функция возвращает идентификатор SQL-соединения – положительное значение типа Numeric, если соединение установлено, и –1 – в противном случае.

Замечание. Следует различать идентификатор соединения и возвращаемый функцией SQLCONNECT( ) идентификатор SQL-соединения, посредством которого осуществляется доступ к источнику данных. Все прочие SQL-функции оперируют именно этим идентификатором.

Параметры:

nStatementHandle – обеспечивает создание нового идентификатора SQL-соединения для существующего разделяемого SQL-соединения, представленного nStatementHandle. Новый идентификатор перенимает установки идентификатора nStatementHandle, а не использует заданные по умолчанию. При попытке создать новый идентификатор для неразделяемого соединения VFP генерирует ошибку.

Функция SQLCONNECT(nStatementHandle) может быть также употреблена для получения нового идентификатора SQL-соединения, на основе разделяемого SQL-соединения открытого функцией SQLSTRINGCONNECT( ).

cConnectionName – имя соединения, созданного командой CREATE CONNECTION или проектировщиком соединения. База данных, которой принадлежит соединение cConnectionName, в момент выполнения SQLCONNECT( ) должна быть текущей.

Вызов SQLCONNECT( ) с параметром cConnectionName и без параметра lShared или с lShared равным .F. приведет к созданию неразделяемого соединения.

cDataSourceName – ODBC-имя источника данных.

Источник данных может быть выбран в Select Connection or Data Source-диалоге, который появляется при вызове SQLCONNECT( ) без единого параметра или только с параметром lShared.

cUserID – идентификатор пользователя.

cPassword – пароль пользователя.

lShared – соединение откроется неразделяемым, если параметр равен .F. (по умолчанию), и разделяемым – в противном случае.

Замечание. Необходимо закрыть Login-диалог ODBC, обеспечив тем самым проход SQL через Microsoft Transaction Server. Чтобы это сделать, либо используется вызов

&& nStatementHandle – идентификатор SQL-соединения, выработанный SQLCONNECT( )

SQLSetProp(nStatementHandle, 'DispLogin', 3)

либо употребляется проектировщик соединения.

Пример. Создаются 3 идентификатора SQL-соединений, ассоциированных с одним и тем же ODBC-источником данных – BookSale.

close databases

open database d:\HomeLibrary\HomeLibrary

&& Разделяемое SQL-соединение на основе именованного соединения BookSale

nStHandle1 = SQLConnect('BookSale', .T.)

&& Разделяемое SQL-соединение; указываем ODBC-имя источника данных

nStHandle2 = SQLConnect('BookSaleDataBase', 'nick', 'name', .T.)

&& Новый идентификатор на основе существующего SQL-соединения
&& с идентификатором nStHandle2

nStHandle3 = SQLConnect(nStHandle2)

? nStHandle1, nStHandle2, nStHandle3

&& Разрываем SQL-соединения

SQLDisconnect(nStHandle1)

SQLDisconnect(nStHandle2)

SQLDisconnect(nStHandle3)

Возможный вывод:

1  2  3

Функция

SQLSTRINGCONNECT([lShared] | [cConnectString [, lShared]])

устанавливает SQL-соединение с источником данных, используя строку соединения. Возвращает, как и SQLCONNECT( ), идентификатор SQL-соединения или –1, если соединение не установлено.

Параметры:

lShared – соединение откроется неразделяемым, если параметр равен .F. (по умолчанию), и разделяемым – в противном случае.

cConnectString – строка соединения источника данных, требуемая при работе с некоторыми ODBC-драйверами.

Замечание. Источник данных можно выбрать в диалоге "Выбор источника данных", который откроется, если вызвать SQLSTRINGCONNECT( ) без cConnectString, например:

nStHandle = SQLStringConnect(.T.)

или

nStHandle = SQLStringConnect("", .T.)

Пример. Устанавливается SQL-соединение с источником данных BookSaleDataBase.

&& Пробелы между именами и знаками должны отсутствовать

nStHandle = SQLStringConnect('dsn=BookSaleDataBase;uid=nick;pwd=name')

или, когда идентификатор и пароль пользователя хранят переменные:

myUid = 'nick'

myPass = 'name'

nStHandle = SQLStringConnect('dsn=BookSaleDataBase;uid=<myUid>;pwd=<myPass>')

if nStHandle > 0 then

         MessageBox('SQL-соединение создано!')

         && Разрываем SQL-соединение

         SQLDisconnect(nStHandle)

else

         MessageBox('Не удалось создать SQL-соединение!')

endif

Пример. Показывает, как использовать SQLSTRINGCONNECT( ) без имени DSN.

lcDSNLess="driver=SQL Server;server=<servername>;uid=<userid>;pwd=<password>"

или

lcDSNLess="driver={SQL Server};server=<servername>;uid=<userid>;pwd=<password>"

или

lcDSNLess="driver={SQL Server};" ;

         + "server=<servername>;" ;

         + "uid=<userid>;" ;

         + "pwd=<password>;" ;

         + "database=PUBS;" ;

         + "wsid=<machine name or userid>;" ;

         + "app=MicroX(R) Sample App"

nStHandle = SQLStringConnect(lcDSNLess)

Замечание. Строка соединения, формируемая проектировщиком соединения при выборе переключателя Connection string и последующем указании в качестве источника данных BookSaleDataBase, может иметь следующий вид:

DSN=BookSaleDataBase;DBQ=C:\AccessData\BookSale.mdb;DefaultDir=C:\AccessData;DriverId=25;FIL=MS Access;MaxBufferSize=4096;PageTimeout=5;PWD=name;UID=admin;

Функция

SQLDISCONNECT(nStatementHandle)

разрывает SQL-соединение, указанное параметром nStatementHandle, с источником данных.

Вызов

SQLDISCONNECT(0)       && nStatementHandle = 0

разрывает все активные SQL-соединения.

Если функцию вызвать внутри последовательности функций, работающих в асинхронном режиме, или во время транзакции, то VFP сгенерирует ошибку.

Результат и параметр функции описаны в разд. 16.3.3.

Функция

SQLIDLEDISCONNECT(nStatementHandle)

временно разрывает SQL-соединение. Возвращает 1, если действие выполнено, или –1 – в противном случае. Неудача может возникнуть, например, если соединение занято.

Временно прерванное соединение автоматически восстанавливается, как только возникает необходимость в выполнении операции. ODBC-свойство ODBChstmt равно 0, если идентификатор соединения временно освобожден; свойство ODBChdbc равно 0, если соединение временно прервано. Разделяемое соединение временно прерывается после временного освобождения всех его идентификаторов.

Функция

SQLSETPROP(nStatementHandle, cSetting [, eExpression])

устанавливает свойство, указанное параметром cSetting, активного соединения, заданного параметром nStatementHandle. Если в качестве nStatementHandle передан 0, то SQLSETPROP( ) установит свойство на уровне окружения соединения.

Результат функции и параметр nStatementHandle описаны в разд. 16.3.3.

Параметр:

cSetting – строка с именем устанавливаемого свойства. Может принимать приведенные в табл. 16.7 значения (часть свойств описана в табл. 14.15).

Таблица 16.7

Свойства SQL-соединения

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

243.1.-Результат-полученный-SQLConnect

Рис. 16.11. Результат, полученный SQLConnect( )

Функция

SQLCOLUMNS(nStatementHandlecTableName
                   [, "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

243.2.-Сведения-о-столбцах-таблицы-Authors-в-формате-FOXPRO

Рис. 16.12. Сведения о столбцах таблицы Authors в формате "FOXPRO"

243.3.-Одна-запись-курсора-BookSaleAuthorsCur-в-формате-NATIVE

Рис. 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)

243.4.-Фрагмент-курсора-Publishers

Рис. 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)

243.5.-Новые-записи-в-Publishers

Рис. 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-оператор.