Анимация
JavaScript
|
Главная Библионтека Синхронный пакетный режим (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) =CURSORSETPROP(KeyFieldList,account,key customer) =CURSORSETPROP(updatablefieldlist,summa) =CURSORSETPROP(updatenamelist,; account account.account,key customer account ; key customer,; summa account.summa) =CURSORSETPROP(sendupdates,.T.) REPLACE ALL field2 WITH 27 IF DAY(DATE())=2 SQLROLLBACK(h) ELSE SQLCOMMIT(h) ENDIF USE =SQLDISCONNECT(h) Создание внешних представлений В главе 7 обсуждались представления и работа с ними. Далее мы продолжим разговор о них, но будем работать с данными либо внешнего формата, либо с данными смешанного характера, то есть исходные таблицы могут быть как формата Visual FoxPro, так и любого внешнего формата. Представьте, например, ситуацию такого рода. Ваша организация работала с данными с помощью приложений, написанных с использованием FoxPro 2.6 или более ранних версий. Но вот принято решение о переходе на версию Visual FoxPro 3.0 или выше. Можно поступить следующим образом. Ждать, пока программисты перепишут все приложения с использованием новой версии, потом, когда новая версия будет готова, отладить ее, подготовить соответствующее аппаратное обеспечение и начать работать. А можно поступить по-другому. Перейти частично на новую версию, а файлы данных хранить в формате FoxPro 2.6, там где их еще используют старые приложения, постепенно переводя их в новый формат по мере обновления техники и перевода отдельных частей приложений на новую версию. Рассмотрим синтаксис команды CREATE SQL VIEW для создания внешнего представления. CREATE SQL VIEW [ViewName ] [REMOTE] [CONNECTION ConnectionName [SHARE] CONNECTION DataSourceName] [AS SQLSELECTStatement] Для создания внешнего представления надо указывать ключевое слово REMOTE. Далее вы можете с помощью ключевого слова CONNECTION создать представление либо с помощью соединения, либо с помощью источника данных. Таким образом, во втором случае вы минуете соединение. Хорошо это или плохо? Это надо решать для конкретной задачи индивидуально. В случае использования соединения вы получаете более полный контроль над процессом получения данных, так как у вас, исходя из вышеизложенного, есть функции, с помощью которых вы легко можете управлять свойствами соединения. Представление помимо этого может иметь соединение, разделенное между несколькими представлениями. Таким образом, меняя свойства одного соединения, вы получаете контроль над несколькими наборами внешних данных. Перед тем как вы начнете создавать внешнее представление, лучше уже иметь готовое определение соединения в текущей базе данных или подходящий набор источников данных, полученных с помощью ODBC, хотя это и не является необходимым требованием. Поэтому выберите один из способов построения внешних запросов. Если вы работаете с использованием Project Manager, то выберите нужную базу данных и, установив курсор на пункте Remote Views, как это показано на рис. 8.4, нажмите кнопку New. 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 |