Анимация
JavaScript
|
Главная Библионтека Сквозной запрос SQL (SQL pass-through) обеспечивает прямой доступ к внешнему серверу с помощью функций сквозного запроса SQL. Эти функции расширяют возможности доступа к серверу и управления им, предлагаемые представлениями. Вы можете, например, составлять описание данных на внешнем сервере, устанавливать свойства сервера и обращаться к хранимым процедурам сервера. Сквозной запрос SQL является наилучшим средством для создания результирующих множеств, предназначенных только для чтения, и для использования любого другого синтаксиса SQL. В отличие от представления, которое является результирующим множеством оператора SQL SELECT, сквозные запросы SQL позволяют посылать на сервер все что угодно, используя функцию SQLEXEC() для системы Visual FoxPro. Подробнее об отдельных функциях см. главу 8. В конце данной главы приведен пример использования технологии SQL pass-through на Visual FoxPro. С помощью сквозных запросов SQL вы сами можете создавать курсоры. Механизм сквозных запросов SQL предлагает хотя и более непосредственный, но менее долговечный доступ к серверу, чем представления. Если описания представлений хранятся в базе данных на постоянной основе, то курсоры, созданные сквозными запросами SQL, существуют только в рамках текущего сеанса. Чтобы с помощью сквозных запросов SQL подсоединиться к внешнему источнику данных ODBC, сначала вызовите функцию Visual FoxPro SQLCONNECT(), которая создает соединение. После этого можно пользоваться функциями сквозных запросов SQL Visual FoxPro для передачи команд во внешний источник данных на выполнение. Если создать соединение с помощью сквозных запросов SQL, информация об этом соединении не будет сохранена в базе данных в качестве определения именованного соединения. Как пользоваться функциями сквозных запросов SQL в Visual FoxPro? 1. Проверьте способность системы соединить компьютер с источником данных. Воспользуйтесь утилитой Test ODBC в составе ODBC или ей подобной. 2. Установите соединение с источником данных с помощью функции SQLCONNECT() или SQLSTRINGCONNECT(). Использует асинхронную Полностью поддерживает постепенную выборку при программируемую асинхронную выполнении кода SQL выборку Таким образом, технология сквозных запросов SQL предоставляет следующие преимущества по сравнению с внешними представлениями: • Вы можете пользоваться функциональными возможностями, специфическими для сервера, например хранимыми процедурами и встроенными функциями на базе сервера. • Вы можете использовать расширенные возможности SQL, поддерживаемые сервером, а также команды определения данных, администрирования сервера и защиты. • Вы получаете более полный контроль над операторами Update, Delete и Insert сквозных запросов SQL. • Вы расширяете возможности контроля над внешними транзакциями. Visual FoxPro может обрабатывать сквозные запросы SQL, возвращающие более одного результирующего множества. Сквозные запросы SQL имеют и ряд недостатков. Основные из них: • По умолчанию сквозной запрос SQL всегда возвращает не обновляемый моментальный "снимок" внешних данных, хранящихся в активном курсоре представления. Курсор можно сделать обновляемым, установив соответствующие свойства с помощью функции CURSORSETPROP(). Напротив, обновляемое внешнее представление обычно не требует установки свойств для обновления внешних данных. • Команды SQL нужно вводить прямо в окне команд или в программе, не пользуясь графическим конструктором представлений. Независимо от того, какая технология используется - внешние представления или сквозные запросы SQL, вы можете выполнять запросы и обновлять внешние данные. Практика показывает, что обычно используются как внешние представления, так и сквозные запросы SQL. Например, если вы соединяете Visual FoxPro с источником данных master на сервере SQL Server, вам следует зарегистрироваться в качестве системного администратора (идентификатор пользователя "sa") с паролем "", выдав следующую команду: lhandle=SQLCONNECT(master,sa,") 3. Воспользуйтесь функциями сквозных запросов SQL в составе Visual FoxPro для извлечения данных в курсоры Visual FoxPro и обработки этих данных с помощью стандартных команд и функций Visual FoxPro. Например, можно выдать запрос в таблицу Customer и просмотреть полученный курсор с помощью следующей команды: ? SQLEXEC (lhandle, "select * from customer" , ; "my cursor") BROWSE 4. Отсоединитесь от источника данных с помощью функции SQLDISCONNECT(). =SQLDISCONNECT(lhandle) Пример использования технологии SQL pass-through на Visual FoxPro SET CONSOLE OFF * Установка соединения с источником данных lhandle=SQLCONNECT(master,sa,") IF lhandle>>0 && Проверка на наличие связи с SQL Server * Следующие три строчки программного кода удаляют * устройство Rdev lib и устройство Rdev log, * так как впоследствии мы создаем новые устройства с * подобными именами и со своими параметрами use m=SQLEXEC(lhandle,"USE master") mlibr=SQLEXEC(lhandle,"sp dropdevice Rdev lib, delfile") mlogr=SQLEXEC(lhandle,"sp dropdevice Rdev log, delfile") * Создаем устройство для нашей БД mlib=SQLEXEC(lhandle,"DISK INIT ; NAME = Rdev lib, ; PHYSNAME = C:\SQL 60\DATA\SAMP LIB.DAT, ; VDEVNO = 1, ; SIZE = 5120") * Создаем устройство для журнала БД mlog=SQLEXEC(lhandle,"DISK INIT ; & NAME = Rdev log, ; PHYSNAME = C:\SQL 60\DATA\SAMP LOG.DAT, ; VDEVNO=2, ; SIZE = 2048") * Если процесс создания * устройств прошел успешно * Проверка наличия БД auto store * на сервере, и , если она существует, * мы ее удаляем IF mlib>>0 AND mlog>>0 =SQLEXEC(lhandle,"IF EXISTS ( SELECT name FROM ; sysdatabases ; WHERE name IN (auto store) ); BEGIN DROP DATABASE auto store END") * Создаем базу данных auto store, которая будет * размещаться на двух * устройствах Rdev lib и устройстве для журнала * транзакций базы данных Rdev log creat data=SQLEXEC(lhandle,"CREATE DATABASE auto store ; ON Rdev lib = 10 LOG ON Rdev log = 4") * Если процесс создания БД прошел успешно IF creat data>>0 =SQLEXEC(lhandle,"USE auto store") * Проверка наличия таблицы country на сервере, и, если она * существует, мы ее удаляем =SQLEXEC(lhandle,"IF EXISTS (SELECT name FROM sysobjects; WHERE type = U AND name = country); DROP TABLE country") * Создаем таблицу Сountry cr country=SQLEXEC(lhandle, ; "CREATE TABLE country (key country smallint ; IDENTITY(1,1) ; PRIMARY KEY CLUSTERED, name country varchar(20) ; NOT NULL, times timestamp)") * Проверка наличия таблицы Firm на сервере, и, если она * существует мы ее удаляем =SQLEXEC(lhandle,"IF EXISTS (SELECT name ; FROM sysobjects WHERE type = U AND name = firm) ; DROP TABLE firm") * Создаем таблицу Firm cr firm=SQLEXEC(lhandle, ; "CREATE TABLE firm (key firm smallint IDENTITY(1,1) ; PRIMARY KEY CLUSTERED, name firm varchar(20) NOT NULL, ; key country smallint REFERENCES country(key country), ; times timestamp)") * Проверка наличия таблицы Fuel oil на сервере, * и, если она существует, мы ее удаляем =SQLEXEC(lhandle,"IF EXISTS (SELECT name ; FROM sysobjects WHERE type = U AND name = fuel oil) ; DROP TABLE fuel oil") * Создаем таблицу fuel oil cr fuel=SQLEXEC(lhandle, ; "CREATE TABLE fuel oil (key fuel oil smallint ; IDENTITY(1,1) ; PRIMARY KEY CLUSTERED, name fuel oil varchar(20) NOT NULL,; times timestamp)") * Проверка наличия таблицы Tyre на сервере, и, если она * существует, мы ее удаляем =SQLEXEC(lhandle,"IF EXISTS (SELECT name ; FROM sysobjects WHERE type = U AND name = tyre) ; DROP TABLE tyre") * Создаем таблицу Tyre cr tyre=SQLEXEC(lhandle, ; "CREATE TABLE tyre (key tyre smallint IDENTITY(1,1) ; PRIMARY KEY CLUSTERED, name tyre varchar(20) NOT NULL, ; times timestamp)") * Проверка наличия таблицы Body на сервере, и, если она * существует, мы ее удаляем =SQLEXEC(lhandle,"IF EXISTS (SELECT name ; FROM sysobjects WHERE type = U AND name = body) ; DROP TABLE body") * Создаем таблицу body cr body=SQLEXEC(lhandle,; "CREATE TABLE body (key body smallint IDENTITY(1,1) ; PRIMARY KEY CLUSTERED, name body varchar(20) NOT NULL, ; times timestamp)") * Проверка наличия таблицы Model на сервере, и, если она * существует, мы ее удаляем =SQLEXEC(lhandle,"IF EXISTS (SELECT name ; FROM sysobjects WHERE type = U AND name = model) ; DROP TABLE model") * Создаем таблицу Model cr model1=SQLEXEC(lhandle, ; "CREATE TABLE model (key model smallint IDENTITY(1,1) ; PRIMARY KEY CLUSTERED, name model varchar(20) NOT NULL, ; key firm smallint DEFAULT 1 REFERENCES firm(key firm), ; swept volume numeric(5) DEFAULT 1 CHECK ; (swept volume>>1) NULL)") cr model2=SQLEXEC(lhandle, ; "ALTER TABLE model ADD quantity drum numeric(2) ; DEFAULT 1 ; CHECK (quantity drum>> = 1) NULL, capacity numeric(5,1) NULL, torgue numeric(5,1) NULL, key fuel oil ; smallint DEFAULT 1 ; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [ 65 ] 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |