|
Программирование >> Разработка пользовательского интерфейса
После создания соединения мы можем установить его свойства. Это возможно практически для всех свойств, кроме двух, связанных с внутренними указателями ODBC: ODBChdbc и ODBChstmt. Свойства можно устанавливать с помощью Конструктора соединения или с помощью функции SQLSETPROP(). Для проверки текущих установок свойств используется функция SQLGETPROP(). Функция SQLSETPROP() имеет следующий синтаксис: SQLSETPROP(nConnectionHandle, cSetting, eExpression) Функция SQLSETPROP() устанавливает свойства активного соединения. Надо использовать эту функцию для установки свойств на уровне соединения. Чтобы установить эти свойства на уровне окружения Visual FoxPro и сделать их значениями по умолчанию, нужно использовать вместо указателя соединения (аргумент nConnectionHandle) значение 0. Функция SQLSETPROP() возвращает 1, если установка свойства завершилась успешно, -1, если случилась ошибка на уровне соединения, или -2, если ошибка случилась на уровне окружения. Свойство ConnectTimeOut может быть установлено только на уровне Visual FoxPro. Все остальные свойства можно устанавливать как на уровне Visual FoxPro, так и на уровне соединения. Установки, сделанные на уровне Visual FoxPro, являются значениями по умолчанию для всех последующих вновь создаваемых соединений. Функция SQLGETPROP() служит для чтения свойств текущего соединения. Если аргументом вместо указателя на соединение будет значение 0, то мы получим текущие установки по умолчанию для текущего окружения Visual FoxPro. Синхронный и асинхронный процессы Когда вы делаете запрос к внешнему источнику данных, Visual FoxPro выполняет запрос синхронно. (Синхронный процесс - это процесс по умолчанию для Visual FoxPro.) Visual FoxPro не возвращает контроль приложению, пока SQL выражение не выполнится полностью. Программа останавливает свою работу и ждет, пока не обработается весь запрос и данные не вернутся к клиенту. Тем не менее при использовании SQL pass-through вы можете сделать процесс асинхронным, то есть программа может выполнять свои следующие команды, а выборка будет идти в фоновом режиме, заполняя курсор набором данных. Например: myhandle=SQLCONNECT( mysqlconnect ) lA=SQLGETPROP( myhandle , Asynchronous ) IF !lA=SQLSETPROP( myhandle , Asynchronous ,.T.) ENDIF Свойство BatchMode определяет, как будут выбираться множественные наборы данных, когда используется функция SQLEXEC(). Значение по умолчанию для свойства BatchMode - истина. При этом не возвращается никаких результатов от функции SQLEXEC(), пока функция не завершит свое выполнение. Например, если функция SQLEXEC() содержит два выражения SQL SELECT, никаких результатов не будет возвращено, если оба процесса запущены в режиме BatchMode, установленным в истину. Если режим не пакетный, то результаты возвращаются в паре с функцией SQLMORERESULTS(). Например: myhandle=SQLCONNECT( mysqlconnect ) =SQLSETPROP(myhandle, MatchMode ,.T.) =SQLEXEC(myhandle, SELECT * FROM account ,; SELECT * FROM Country , Results ) mores=0 DO WHILE mores << 2 mores=SQLMORERESULTS(myhandle) ENDDO Сочетание значений двух свойств дает нам четыре комбинации возможных режимов: Cинхронный Асинхронный Synchronous Batch Asynchronous Batch Synchronous NonBatch Asynchronous Nonbatch Синхронный пакетный режим (Synchronous Batch Mode) - выражения, отправленные на сервер, не будут возвращать контроль программе, пока все наборы данных не будут выбраны. Асинхронный пакетный режим (Asynchronous Batch Mode) - выполнение в данном режиме будет возвращать 0 при каждом обращении функции, породившей процесс, пока не будут возвращены все наборы результатов. Синхронный не пакетный режим (Synchronous Nonbatch Mode) - выражения, выполняемые в этом режиме, выберут первый набор и вернут 1. Далее должна вызываться функция SQLMORERESULTS(), повторяясь, пока не будут выбраны все наборы данных. Если необходимы разные названия для полученных курсоров, новое имя можно указать при обращении к функции SQLMORERESULTS(). Функция SQLMORERESULTS() вернет 2, когда все наборы данных будут выбраны. Асинхронный не пакетный режим (Asynchronous NonBatch Mode) - для того чтобы вернуть все наборы результатов, необходимо после того, как функция, вызвавшая процесс, вернет 1, вызывать функцию SQLMORERESULTS(), пока она не вернет 2. Основные свойства соединений перечислены в табл. 8.4. Таблица 8.4 Основные свойства соединений Свойство Описание Connect- Указывает время ожидания (в секундах), после которого TimeOut должно возвратиться сообщение об ошибке соединения. Если указать 0, то время ожидания неопределенно и сообщение об ошибке не будет получено никогда. Это свойство может принимать значение от 0 до 600. Значение по умолчанию - 15 секунд. Доступно для чтения и записи. Idle-Timeout Указывает промежуток времени, после которого активное соединение деактивизируется. При этом соединение не должно использоваться в течение этого промежутка времени. Значение по умолчанию - 0 (интервал бесконечен). Доступно для чтения и записи. Query- Указывает время ожидания перед возвратом сообщения TimeOut об ошибке, в случае неудачного выполнения запроса соединения. Если указать значение 0, то сообщение об ошибке никогда не будет возвращено. Может принимать значение от 0 до 600. Доступно для чтения-записи. Transactions Содержит числовое значение, которое определяет, как соединение управляет транзакциями внешней таблицы. Установка может принимать следующие значения: 1 или DB TRANSAUTO (из VISUAL FOXPRO.H) - является значением по умолчанию; транзакции для внешней таблицы обрабатываются автоматически; 2 или DB TRANSMANUAL (из VISUAL FOXPRO.H) -транзакции обрабатываются вручную через функции SQLCOMMIT() и SQLROLLBACK(). WaitTime Время в миллисекундах, задающее интервал, с которым Visual FoxPro проверяет, закончилось ли выполнение операторов SQL. Значение по умолчанию - 100 миллисекунд. Доступно для чтения и записи. Функция SQLSTRINGCONNECT() позволяет устанавливать соединение с помощью строки соединения. Таким образом, вы можете обойтись без хранения определения соединения в базе данных. Параметры строки могут отличаться в зависимости от используемого драйвера. Описание параметров приводится в документации для используемого драйвера. Например: h=SQLSTRINGCONNECT(dsn=MyAutostoreSQL;uid=sa; pwd=Immanager) =SQLEXEC(h, SELECT * FROM Account , FoxAccount ) Если вы создадите соединение, которое будет, к примеру, иметь название C1 и строку соединения, которую мы использовали в первой строчке последнего примера, то можно будет использовать следующую процедуру, итогом которой будет совершенно аналогичный результат. CREATE CONNECTION c1; CONNSTRING dsn=MyAutostoreSQL;uid=sa;pwd=Immanager h=SQLCONNECT(c1) =SQLEXEC(h, SELECT * FROM Account , FoxAccount ) Каждую операцию по соединению с источником данных необходимо завершать отсоединением. В противном случае на каком-то этапе количество активных соединений превысит возможности вашего приложения. Для этого используется функция SQLDISCONNECT(). Например: CREATE CONNECTION c1; CONNSTRING dsn = MyAutostoreSQL;uid=sa;pwd=Immanager h=SQLCONNECT(c1) =SQLEXEC(h, SELECT * FROM Account , FoxAccount ) =SQLDISCONNECT(h) При этом следует отметить следующий факт. Получив курсор с помощью функции SQLEXEC() и выполнив операцию SQLDISCONNECT(), вы не заметите никаких изменений при работе с курсором. Здесь стоит глубже вникнуть в суть процесса. При выполнении функции SQLEXEC() мы получаем курсор в памяти, который по большому счету никак не связан с данными на сервере. Здесь мы вплотную соприкасаемся с понятием модифицируемый курсор. Сейчас необходимо вспомнить функцию CURSORSETPROP(), о которой мы много говорили в предыдущей главе. Получив курсор, для установки необходимых вам свойств используйте функцию CURSORSETPROP(), чтобы изменения, которые вы проводите над данными в курсоре, отображались на сервере. Если в следующей процедуре отключить связь до закрытия курсора, удалив строчку с единственной командой USE, все равно нельзя будет в дальнейшем проводить обновления в этом наборе данных. CREATE CONNECTION c1; CONNSTRING dsn = MyAutostoreSQL;uid=sa;pwd=Iammanager h=SQLCONNECT(c1) h=SQLCONNECT( cn1 ) =SQLEXEC(h, SELECT * FROM Account , FoxAccount ) =CURSORSETPROP(tables,Account) =CURSORSETPROP(KeyFieldList,field1) =CURSORSETPROP(updatablefieldlist,field2) =CURSORSETPROP(updatenamelist,; field1 mytable.field1,field2 mytable.field2) =CURSORSETPROP(sendupdates,.T.) BROWSE USE =SQLDISCONNECT(h) Курсор, полученный с помощью функции SQLEXEC(), имеет оптимистическую буферизацию записи. С помощью функции CURSORGETPROP() вы можете установить нужный вам тип буферизации. Помимо этого следует обратить внимание на тип обработки транзакций. Если свойство Transactions равно 1, то у вас нет практически никакого контроля над транзакциями, так как они являются автоматическими. Если установить это свойство равным 2, то вы сможете управлять процессом транзакций. Например, при изменении содержимого нескольких записей, в зависимости от сложившихся обстоятельств, вы сможете либо отменить все изменения, либо записать их на диск. Для этого используются функции SQLCOMMIT() и SQLROLLBACK(). Параметром обеих функций является указатель вашего соединения. При этом учтите, что если вы не используете эти функции и просто закрываете курсор, то изменения автоматически запишутся на диск, естественно, если они не вступают в конфликт с какими-либо условиями или обстоятельствами, обычно появляющимися при работе в многопользовательском режиме. В следующем примере в зависимости от дня недели изменения либо записываются на диск, либо происходит откат. При этом предварительно устанавливается требуемое значение свойства Transactions для активного соединения. CREATE CONNECTION cn1 CONNSTRING dsn=myteach h=SQLCONNECT( cn1 ) =SQLEXEC(h, SELECT * FROM Account , FoxAccount ) =SQLSETPROP(h, Transactions ,2) =CURSORSETPROP(tables,Account)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |