Анимация
JavaScript


Главная  Библионтека 

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

vDolQ Manaqcr - C:\sportMalcQch.nfidb

Fib WiTS*™ Нф

Tabb

fSouice-ТаЫе

Connect

□RDEFIS.DB МуТдЫа

IOD 9l iD-iPi -vfpSl :S ouice[i В - С VPr4J!:i:t boDl :(tet*{ie»-c-itMrt\lotMtW и*


Рис. 8.8.

New Attached Table

Attachment Name

Database Name

lonnect String

jet Engine MDB

Table to Attach

Г AttachSavePWD

~ AttachExclusive

Attach

J Close

Рис. 8.9.

Чем хороши присоединенные таблицы? Во-первых, не требуется никакого программирования для того, чтобы работать с ними. Во-вторых, они модифицируемы, то есть все изменения, которые вы будете проводить с записями, будут отражаться на сервере. Исключением является случай, когда Access однозначно не сможет определить запись на сервере, в которой надо провести обновление данных в колонках.

Чем плохи присоединенные таблицы? Только тем, что в некоторых случаях вам будет недоставать скорости обработки. Какой есть выход из положения? Использовать другие методы для получения набора данных.

Но сначала закончим с присоединенными таблицами. Помимо визуального способа, есть и программный. Для этого мы должны использовать DAO - набор объектов для работы с данными. Вы уже не раз встречались на страницах этой книги с конструкцией следующего типа:

Dim MyDb As Database

Dim mytableDef As TableDef

Set MyDb = DBEngine.Workspaces(0).Databases(0)

Set MytableDef = CreateTabledef("JustProgrammaticalyMadeTable")

Данная конструкция создает таблицу в текущей базе данных. Отметим, что этот пример не завершает построения таблицы, так как мы не создали полей и не добавили таблицу в коллекцию таблиц текущей базы данных.

Следующий пример создает присоединенную таблицу формата Visual Fox-Pro 3.0. Необходимо



лишь добавить две строки, которые устанавливают свойства Connect и SourceTableName для вновь создаваемого объекта. В данном примере создается присоединенная таблица AttachTable. Для этого используется источник данных vfp34. На вашем компьютере название таблицы и источника данных (Data Source) могут быть иными.

Public Sub TableCREATE()

Dim myDb As DATABASE, mytdef As TableDef

Set myDb = DBEngine.Workspaces(0)("Autostore.mdb")

Set mytdef = myDb.CreateTableDef("AttachTable")

mytdef.Connect = "ODBC;dsn=vfp34"

mytdef.SourceTableName = "country"

myDb.TableDefs.Append mytdef End Sub

Данную процедуру можно запустить как в Access, так и в Visual Basic или Microsoft Excel. Единственное отличие последних в том, что необходимо проследить за доступностью объектов DAO приложению. После выполнения этого или подобного кода в базе данных появится значок, а если вы откроете присоединенную таблицу в режиме Конструктора, то, воспользовавшись командой Свойства меню Вид, сможете прочитать в строке Описание строку Соединения.

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

Обратим внимание, что с присоединенными таблицами нельзя использовать метод Seek. Поэтому здесь нужно придумать другие способы оптимизации поиска, самым лучшим из которых является, извините за назойливость, параметрический запрос.

Перед тем как использовать транзакции, необходимо выяснить, поддерживаются ли операции такого рода в источнике данных. Для баз данных ODBC нельзя использовать вложенные транзакции.

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

Dim CurrentDatabase As Database Dim MySet As Recordset

Открываем внешнюю базу данных формата FoxPro

Set CurrentDatabase = DBEngine.Workspaces(0).OpenDatabase

("C:\FOXPRO\DATA\", False, False, "FoxPro 2.5")

Открываем таблицу Customer

Set MySet = CurrentDatabase.OpenRecordset("Customer")

В приведенном примере в начале делается текущей база данных внешнего формата (в нашем случае, так как FoxPro 2.х не поддерживает понятие базы данных как контейнера таблиц, это каталог C:\FOXPRO\DATA\), а затем напрямую открывается таблица покупателей в этом каталоге. Понятно, что никакого значка для данной таблицы в текущей базе данных не появится и работать с этими данными мы сможем только программным способом. Еще одним недостатком данного метода доступа к внешним данным является более медленная, по сравнению с присоединенной таблицей, скорость работы.

Помимо присоединения уже существующих таблиц, хранящихся в источнике данных, вы можете создавать новые таблицы, которые станут присоединенными.

Ниже приводится простейший пример создания таблицы формата FoxPro 2.6.

Dim CurrentDatabase As Database Dim MyTableDef As TableDef

Set CurrentDatabase = DBEngine.Workspaces(0).OpenDatabase("C:\DATA", False, False, "FoxPro

2.6")

Set MyTableDef = CurrentDatabase.CreateTableDef("FromAccess") MyTableDef.Fields.Append MyTableDef.CreateField("Field1", DB TEXT, 15) CurrentDatabase.Tabledefs.Append MyTableDef

Следующим способом для работы с данными на сервере, который мы рассмотрим, будет SQL pass-through. Выборка данных при использования SQL pass-through проходит быстрее, так как запрос сразу отправляется на сервер, минуя процессор баз данных Jet. Но полученные запросы являются не модифицируемыми, то есть изменения в них не передаются на сервер. Следовательно, вам нужно использовать какие-то другие способы для обновления данных на



Свойства запроса

Общие I

□ писание........................

Строка подключения ODBC......... pDBC;DSN=superbase;SourceDB

Возврат записей.................. Да

Таблица сообщений............... Нет

Время ожидания ODBC............. GO

Рис. 8.10.

Среди других свойств следует обратить внимание на Возврат записей. Если вы собираетесь использовать запросы определения данных, то установите значение этого свойства равным

"Нет".

В Visual Basic визуальное создание pass-through запросов не доступно при работе с Data Manager.

Для того чтобы создавать запросы pass-through программно, используются объекты QueryDef.

Далее будет разобран небольшой пример, созданный с помощью Visual Basic и использующий pass-through запросы для работы с внешними данными. Приложение состоит из одной формы, которая представлена на рис. 8.11.

Щ Forml

recN П

Account

Summa

Forward

11000

Back

Save

Рис. 8.11.

Данная форма при загрузке использует SQL pass-through запрос для создания набора данных, который мы можем просматривать и редактировать.

сервере, например, использовать запросы модификации. Важным аргументом в пользу использования SQL pass-through запросов является, как уже было сказано выше, более высокая скорость выполнения, но, помимо этого, с помощью SQL pass-through вам доступны не только команды выборки, но и команды определения данных, возможность запускать хранимые процедуры. В итоге вы получаете, в зависимости от данных вам прав, довольно значительные возможности по управлению данными на сервере. По большому счету, визуально запросы pass-through не создаются, но какие-то элементы автоматизации присутствуют. Для того чтобы создать запрос с помощью Конструктора Запросов, перейдите на вкладку Запросы в контейнере базы данных. Затем в меню Запрос выберите команду Запрос SQL и опцию К серверу, которая в английской версии называется Pass-Through. После выбора этого пункта меню больше не будет доступен режим конструктора, то есть SQL команды придется набирать вручную. Не будет доступен даже Построитель. Единственное, что вы можете выбрать - это свойства вашего запроса, среди которых имя источника данных (Data Source). Чтобы получить доступ к диалогу свойств, выберите команду Свойства в меню Вид (рис. 8.10).



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