Для получения доступа к данным из проекта Java обычно используются ADO-объекты (ActiveX Data
Objects), которые определяют модель программирования данных для WFC-приложений.
Основными ADO-объектами являются Connection, Command и Recordset. Объект Connection
позволяет соединяться с базой данных, в результате чего можно запрашивать базу
данных для получения набора записей. Объект Recordset представляет записи, возвращенные
по запросу. Для задания запроса используют либо строку на языке SQL, либо объект
Command.
Кроме того,
ADO предоставляет компонент DataSource, в котором сочетаются функциональные
возможности объектов Connection, Command и Recordset. Информацию о программировании
при помощи объектов ADO см. в «ADO Tutorial (VJ + +)» в интерактивной
документации к Microsoft ActiveX Data Objects. Классы ADO определены в пакетах
com.ms.wfc.data и com.ms.wfc.data.ui.
Примечание
Toolbox в Forms Designer предоставляет только элемент управления
DataSource; объекты Connection, Command и Recordset используются только в коде.
После получения
набора записей (через объект Recordset или компонент DataSource) его можно связать
с WFC-компонентом. WFC поддерживает как простое (simple), так и сложное
(complex) связывание данных, описанное в следующей таблице.
Тип связывания |
Описание |
||
Сложное | Обозначает непосредственное взаимоотношение между набором записей и WFC-компонентом. | ||
Простое |
Обозначает взаимоотношение
между полем в наборе записей и свойством WFC-компонента. Такое связывание
называется простым потому, что компоненту не нужны точные знания
о протоколе передачи данных или об их источнике. |
||
Обратите
внимание, что типы курсора и блокировки набора записей определяют, будут ли
данные в наборе записей динамически отражать изменения информации ,в базе данных
и могут ли быть изменены данные в наборе записей.
Дополнительную
информацию об ADO см. в разделе «Getting Started with ADO 2.0» интерактивной
документзации на Microsoft ActiveX Data Objects.
Простое связывание
данных обозначает взаимоотношение между полем в наборе записей и свойством WFC-компонента.
Когда последнее связано с полем данных, то данные автоматически пересылаются
между ними.
Примечание
При попытке обновить набор записей, предназначенный только для чтения,
набор записей сгенерирует ADO-исключение. Его можно перехватить и присвоить
свойству предыдущее значение; в противном случае значение свойства и значение
поля не будут совпадать.
Свойства
с возможностями связывания
Простое связывание
данных в WFC выполняется с помощью компонента DataBinder, который осуществляет
и контролирует связывание поля со свойством. Компонент DataBinder связывает
свойство, если оно доступно посредством методов, отвечающих следующей структуре:
public <PropertyType>
get<PropertyName>()
public void
set<PropertyName>(<PropertyType>)
Обратите
внимание, что если в Classlnfo этого компонента свойство помечено как BindableAttribute.YES,
то оно значится в окне Properties и на странице проектирования (design page)
компонента в DataBinder. (Свойство, которое не обозначено как связываемое (bindable),
все же можно связывать программно или вручную, вводя его имя в окне Properties
или на странице проектирования.)
Уведомления
об изменениях атрибутов
Компонент,
имеющий связанное свойство, может сгенерировать событие <propertyName>Changed
с целью обозначить изменение значения свойства. Когда это событие происходит,
компонент DataBinder помечает данную связку как подозрительную (dirty). Впоследствии,
когда пользователь переходит к новой записи или когда программно вызывается
метод DataBinder.commitChanges, компонент DataBinder определяет подозрительные
связи и обновляет их в наборе записей.
Примечание
Если Ваш компонент не предоставляет событие <рrоpertyName>Changed
для свойства, связанного посредством компонента DataBinder, то связывание доступно
только для чтения, а Ваш компонент будет заблокирован. Чтобы обойти это ограничение,
Вы вправе самостоятельно программно управлять связыванием путем чтения-записи
набора записей напрямую.
Компонент
DataBinder определен в ADO для выполнения простого связывания данных. Этот компонент
создает и контролирует связывание полей в наборе записей и связываемых свойств
WFC-компонентов. Подробнее о возможности связывания свойства см. в разделе «Свойства
с возможностями связывания».
Хотя один
компонент DataBinder может управлять несколькими связываниями, он ассоциируется
только с единственным набором записей. Чтобы связывать поля из второго набора
записей, нужно использовать другой компонент DataBinder. Кроме того, компонент
DataBinder можно использовать только для связывания компонентвв, находящихся
на одной и той же форме.
Если компонент
со связанным свойством поддерживает уведомление об изменениях этого свойства,
то при изменении значения свойства компонент DataBinder помечает эту связь как
подозрительную. Набор данных обновляется при переходе пользователя на новую
запись или при программном вызове метода DataBinder.commitChanges. Подробности
см. в предыдущем разделе «Уведомления об изменениях атрибутов».
Пример
В следующем
примере показано, как программно выполнить простое связывание данных с помощью
компонента DataBinder. Обратите внимание, что для управления связыванием компонент
DataBinder использует массив объектов DataBinding.
import com.ms.wfc.data, *;
import com.ms.wfc.data.ui.*;
import com.ms.wfc.ui.*;
/* Используем
компоненты Connection и Recordset
для соединения с .базой данных и получения набора записей. */
Connection с
= new Connection();
с. setConnectionSt ring("dsn=myDSN; uid=myUID; pwd=myPWD");
c.open();
Recordset rs
= new Recordset();
rs.setActiveConnection(c);
rs.setSource("select
* from authors");
rs.open();
/* Создаем компонент
DataBinder. Для связи этого
компонента с rs устанавливаем свойство dataSource. */
DataBinder db = new DataBinder();
db.setDataSou
rce(rs);
/* Создаем компоненты, свойства которых подлежат связыванию. */
Edit edifl = new Edit();
Edit edit2 =
new Edit();
/* Присваиваем
свойству связывания компонента DataBinder
массив объектов
DataBinding. Этот массив определяет
связывания свойства
text каждого компонента Edit
с полями в наборе записей. */
db.setBindings(new
DataBinding[] {
new DataBinding(edit1,
"text", "firstName"), new DataBinding(edit2, "text",
"lastName") } }; }
О свойстве
dataSource компонента DataBinder см. в следующем разделе «Сложное связывание
данных». Подробнее об использовании компонента DataBinder в Forms Designer
см. в главе 4 «Доступ к данным».
Сложное связывание
данных относится к компонентам, которые непосредственно взаимодействуют с набором
записей. Компонент со сложным связыванием данных поддерживает свойства dataSource
и data Member, описывающие набор записей, с которым он связывается. Обратите
внимание, что свойства сложно связываемых компонентов допускают простое связывание
посредством компонента DataBinder.
Свойства
dataSource и dataMember
Свойство
dataSource идентифицирует объект, который реализует интерфейс IDataSource. Объект
предоставляет один или несколько наборов записей. Свойство dataMember задает
имя набора записей, с которым происходит связывание компонента. Например:
/* Связывание
компонента с набором записей "Products",
который предоставлен источником данных ds. */
dbComponent.setDataSource(ds);
dbComponent.setDataMember("Products");
Если свойство
dataMember не установлено, выполняетея связывание с набором записей по умолчанию
из источника данных. (Можно явно указать на набор записей по умолчанию, присвоив
null свойству dataMember.)
/* Связываем
компонент с набором записей по умолчанию
из источника данных ds. */ dbComponent.setDataSource(ds);
dbComponent.setDataMember(null); /*
Эта строка не
обязательна. */
Заметьте,
что компоненты Recordset и DataSource уже реализуют интерфейс IDataSource. Следовательно,
можно присвоить один из этих компонентов напрямую свойству dataSource. В этом
случае не нужно задавать свойство dataMember:
/* Присвоить
свойству dataSource напрямую компонент rs типа Recordset
без установки свойства dataMember. */
dbComponent.setDataSou
rce(rs);
Компоненты
со сложным связыванием в Visual J++
Visual J++
поддерживает следующие компоненты со сложным связыванием с данными.
Компонент |
Описание |
||
DataBinder
DataGrid DataNavigator |
Связывает поле из набора записей со свойством WFC-компонента. (Хотя компонент DataBinder используется для простого связывания, сам по себе он предоставляет свойства dataSource и dataMember.) Связывает несколько полей из набора записей и отображает данные в табличном формате. Позволяет пользователю
сменить текущую запись в наборе записей. Все прочие компоненты, связанные
с этим же набором записей, обновляются в соответствии с данными в
новой текущей строке. |
||
Подробнее об использовании этих компонентов в Forms Designer см. в главе 4 «Доступ к данным».
Дело в том, что в его постановке и выводах произведена подмена, аналогичная подмене в школьной шуточной задачке на сообразительность, в которой спрашивается:
- Cколько яблок на березе, если на одной ветке их 5, на другой ветке - 10 и так далее
При этом внимание учеников намеренно отвлекается от того основополагающего факта, что на березе яблоки не растут, в принципе.
В эксперименте Майкельсона ставится вопрос о движении эфира относительно покоящегося в лабораторной системе интерферометра. Однако, если мы ищем эфир, как базовую материю, из которой состоит всё вещество интерферометра, лаборатории, да и Земли в целом, то, естественно, эфир тоже будет неподвижен, так как земное вещество есть всего навсего определенным образом структурированный эфир, и никак не может двигаться относительно самого себя.
Удивительно, что этот цирковой трюк овладел на 120 лет умами физиков на полном серьезе, хотя его прототипы есть в сказках-небылицах всех народов всех времен, включая барона Мюнхаузена, вытащившего себя за волосы из болота, и призванных показать детям возможные жульничества и тем защитить их во взрослой жизни. Подробнее читайте в FAQ по эфирной физике.