Передает команду SQL удаленному Источнику Данных (Серверу), где данная команда обрабатывается.

SQLEXEC(nStatementHandle [, cSQLCommand [, cCursorName[, aCountInfo]]])

Параметры

nStatementHandle

Определяет Дескриптор (указатель, идентификатор) удаленного источника данных, возвращаемый ранее выполненной функцией SQLCONNECT( ). Дополнительную информацию смотрите в разделе: SQLCONNECT( ), функция.

cSQLCommand

Определяет оператор (команду) SQL, направляемую удаленному источнику данных Data Source (DS).

Данный Оператор SQL может содержать параметризированную опцию WHERE, которая характеризует параметризированное Представление View. Вам необходимо определить, или однозначно указать все параметры в опции WHERE до выполнения данной функции SQLEXEC( ). Например, если параметры являются Переменными (variables), они должны быть созданы и иметь конкретные значения до выполнения данной функции SQLEXEC( ). Дополнительную информацию смотрите в разделе: Как: Создать Параметризированное Представление View.

В данный оператор SQL вы можете включать различные выражения. Система Visual FoxPro пытается вычислить все выражения, включенные в оператор SQL, и только после этого направляет данный Оператор в DS (сервер). Visual FoxPro определяет все переменные памяти, вызов пользовательских и системных функций, вычисляет сложные выражения, заключенные в круглые скобки "(...)", которые определяют значения требуемых параметров Представления.

cCursorName

Определяет имя (наименование) Курсора Visual FoxPro, в который выгружаются получаемые результаты выполнения оператора SQL. Если данный параметр функции не указан, Visual FoxPro использует имя по-умолчанию: SQLRESULT.

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

aCountInfo

Определяет имя массива переменных памяти, в который выгружается дополнительная информация о количестве выгруженных строк (записей) в результирующие курсоры (или курсор). Если массив отсутствует, то он будет создан автоматически. Данный массив имеет два столбца: 1 – Алиас Курсора, 2 – количесво записей (строк таблицы).

Столбец Содержит Тип данных Краткое описание

Алиас
курсора

"0"

Character

Указывает на то, что нет результатов выполнения данного оператора SQL. Или выполняемый Запрос не имеет результатов, или оператор SQL не может быть выполнен. (при последнем вызове функции SQLMORERESULTSl), или выполнение оператора SQL прервано в исполнителе DS. Данный результат может быть расположен только в первом элементе рассматриваемого массива. Столбец Count (второй) имеет значение = -1.

Непустая
строка
в верхнем
регистре

Character

Имя результирующего Курсора (алиас). Столбец Count (второй) содержит количество вызруженных Записей, или значение = -1, если требуемые записи отсутствуют. Если Count =  -1, указанный курсор не создается. В условиях Асинхронного выполнения оператора SQL, процесс выборки результирующих записей разделяется между несколькими вызовами соответствующих функций SQLMORERESULTS / SQLEXEC; каждая функция возвращает свое значение количества выгруженных Записей.

Пустая
строка

Character

Указывает на то, что соответствующие операторы SQL (такие как: INSERT, UPDATE, DELETE) не возвращают никаких результатов (наборов данных, курсоров).

Количество

Количество выгруженный
записей.

Integer

Указывает на количество выгруженных записей в результирующий курсор, данное значение возвращается соответствующей функцией ODBC SQLRowCount. Значение = -1 указывает на то, что результирующие записи в курсоре отсутствуют.

Expand imageВозвращаемое значение

Числового типа (Numeric). SQLEXEC( ) возвращает количество выгруженных Курсоров (если их несколько). SQLEXEC( ) возвращает значение = 0, если выполнение последнего оператора SQL еще не законченно, возвращает значение = 1, при нормальном завершении процесса выгрузки данных. SQLEXEC( ) возвращает значение = –1, если произошла ошибка уровня Соединения (ODBC Level Error).

Expand imageКомментарии

Если требуемый оператор SQL имеет достаточно большую длину (более 255 символов), желательно проверять длину строки оператора SQL. Может возникнуть ошибочная ситуация: Error: "Command contains unrecognized phrase/keyword" (Команда содержит незаконченную фразу / слово). В этом случае рекомендуется разбить исходную строку оператора SQL на несколько логических строк, соединенных операндом сложения символьных строк. Например: 

 CopyCode imageКопировать Код
lnRetVal = SQLEXEC(lnHandle, "SELECT <long list of fields> " + ;
"FROM <several tables> " + ;
"WHERE <complex filter expression>")

Если перед непосредственным выполнение функции SQLEXEC( ) используется проверочная, подготовительная функция SQLPREPARE( ), то достаточно указывать только Дескриптор Соединения, обязательный аргумент nStatementHandle. Остальные аргументы функции cSQLCommand / CursorName могут быть опущены. Смотрите дополнительно раздел: SQLPREPARE( ), функция.

Если при выполнении оператора SQL создается один результирующий набор данных, SQLEXEC( ) выгружает один соответствующий Курсор Visual FoxPro. Если данный оператор SQL генерирует несколько результирующих наборов данных, то вы можете определить / задать уникальные имена для каждого из результирующих Курсоров. Для этого: выключите Пакетный режим выполнения: BatchMode = False (.F.), для этого используется соответствующая функция, смотрите раздел: SQLSETPROP( ), функция, при каждом вызове соответствующей функции подгрузки результатов, смотрите раздел: SQLMORERESULTS( ), функция, определяйте новое имя результирующего Курсора. В другом случае, при использовании функции SQLEXEC( ), имена результирующих курсоров создаются последовательным добавлением порядкового номера к базовому имени результирующего курсора.

SQLEXEC( ) одна из 4-х (четырех) функций, которые могут выполняться в Синхронном (synchronously) или Асинхронном (asynchronously) режиме. Асинхронный режим выполнения операторов SQL определяет дополнительным вызовом функции SQLSETPROP( ), где задается соответствующий  синхронный / асинхронный режим выполнения. В Асинхронном режиме вы можете бесконечно (в цикле) выполнять функцию SQLEXEC( ) до тех пор, пока она возвращает значение = 0 (выполнение продолжается, запрос в очереди, и т.д.) - (Still Executing).

Expand imageПример

В следующем примере показаны различные варианты использования функции SQLEXEC( ) для запуска "прямых" SQL-команд или создания и выполнения Хранимых процедур SQL:

 CopyCode imageКопировать Код
CLEAR
LOCAL lnConn
LOCAL lnPercent AS Int && Input parameters must be typed.
LOCAL lnOutput
lnPercent = 50
lnOutput = 0

* Make connection, assuming a local trusted connection.
lnConn = SQLCONNECT('local')
IF m.lnConn > 0 && Success.

* Set the active database to PUBS.
SQLEXEC(m.lnConn, 'use pubs')

* Execute SELECT statement.
SQLEXEC(m.lnConn, 'SELECT * FROM authors', 'PubAuthors')
BROWSE

* Execute INSERT statement, get value of identity field.
SQLEXEC(m.lnConn, "INSERT INTO JOBS (job_desc, min_lvl, max_lvl);
VALUES ('Developer',75,150)")
SQLEXEC(m.lnConn, "SELECT SCOPE_IDENTITY()", "job_id")
? "ID for added Job is " + LTRIM(STR(job_id.exp))

* Execute DELETE statement. Get number of records affected.
SQLEXEC(m.lnConn, "DELETE FROM JOBS WHERE job_desc ='Developer'")
SQLEXEC(m.lnConn, "SELECT @@ROWCOUNT", 'rowcount')
? rowcount.exp, "record(s) deleted"

* Call a stored procedure with no parameters.
SQLEXEC(m.lnConn, 'sp_who', 'activeusers')
BROWSE

* Execute stored procedure with an INPUT parameter.
SQLEXEC(m.lnConn, 'exec byroyalty ?lnPercent','HalfOffAuthors')

* Create temp stored procedure with OUTPUT parameter and call it.
SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc @outparam int OUTPUT AS;
SELECT @outparam=100")
SQLEXEC(m.lnConn, "exec #myProc ?@lnOutput")
? m.lnOutput

* Create a temp stored procedure with INPUT and OUTPUT parameters
* and call it.
SQLEXEC(m.lnConn, "CREATE PROCEDURE #MyProc2 " + ;
"@inputparam INT, " + ;
"@outparam int OUTPUT " + ;
"AS SET @outparam=@inputparam*10")
SQLEXEC(m.lnConn, "exec #myProc2 ?lnPercent, ?@lnOutput")
? m.lnOutput

* Get version information.
SQLEXEC(m.lnConn, 'SELECT @@VERSION','SQLVersion1')
? STRTRAN(SQLVersion1.Exp,CHR(0))

* Disconnect.
SQLDISCONNECT(m.lnConn)
ELSE
? "Unable to connect to SQL Server"
ENDIF
RETURN

Expand imageСм. также