Метод MakeReplicable([ ConnectString ] [, ColumnTracking ]) имеет два параметра. Первый - это путь к базе данных, которую мы делаем реплицируемой. Второй параметр рассмотрим подробнее. Он может принимать два значения True (по-умолчанию) или False . В нашем примере установлено значение False. Это значит, что при синхронизации реплик конфликты будут отслеживаться на уровне записи. Если установлено значение True, то конфликты будут отслеживаться на уровне столбца. Например, два пользователя в разных репликах изменяют различные поля одной записи. Если значение параметра установлено False (уровень записи), то при синхронизации возникнет конфликт. Хотя на самом деле конфликта нет, ведь данные различных столбцов не связаны между собой. Избежать такого конфликта можно установив значение параметра True (уровень столбца). Тогда конфликт при синхронизации возникнет только в том случае, если оба пользователя изменят один и тот же столбец одной и той же записи. Таким образом, использование отслеживания конфликтов на уровне столбца позволяет произвести синхронизацию с наименьшим количеством ошибок, хотя и прибавит системе немного работы. Возможность отслеживания конфликтов на уровне столбца есть только в JRO, в DAO ее нет. Это надо учесть при проектировании базы данных.
По умолчанию, все объекты базы делаются реплицируемыми, т.е. при синхронизации будут обновляться данные во всех таблицах. Если вы хотите чтобы объект базы данных был локальным (при синхронизации данные не обновляются), надо задать ему это свойство до объявления базы реплицируемой. Это можно сделать так:
Private Function KeepObjectLocal(strDBPath As String, strObjectName As String, strObjectType As String) Dim repMaster As New JRO.Replica 'определяем переменную с которой в дальнейшем будем производить все действия
repMaster.ActiveConnection = strDBPath 'Связываем переменную с базой данных repMaster.SetObjectReplicability strObjectName, strObjectType, False 'делаем объект strObjectName, который имеет тип strObjectType локальным (False) или реплицируемым (True)
Set repMaster = Nothing 'удаляем переменную из памяти End Function
Пример вызова функции Call KeepObjectLocal("C:\<Путь к базе данных>\<Имя файла>", "Клиенты", "Tables")
Второй шаг - создание реплики. Для создания реплики используем метод CreateReplica. Function MakeNewReplica(strReplicableDBPath As String, strDescription As String) As Integer Dim repReplicableDB As New JRO.Replica 'определяем переменную с которой в дальнейшем будем производить все действия Dim strNewReplicaDBPath As String 'определяем переменную - имя новой реплики
strNewReplicaDBPath = "C:\<Путь к базе данных>\<Имя файла>" 'получаем имя новой реплики repReplicableDB.ActiveConnection = strReplicableDBPath 'Связываем переменную с базой данных repReplicableDB.CreateReplica strNewReplicaDBPath, strDescription, jrRepTypeFull, jrRepVisibilityGlobal 'Создаем реплику Set repReplicableDB = Nothing 'Удаляем переменную с памяти End Function
Метод CreateReplica ( ReplicaName , Description [, ReplicaType ] [, Visibility ] [, Priority ] [, Updatability ]) имеет такие параметры:
1. ReplicaName - путь и имя новой реплики
2. Description - описание реплики
3. ReplicaType - тип реплики. В нашем примере jrRepTypeFull - полная реплика. (не обязательный параметр)
4. Visibility - видимость реплики. В нашем примере jrRepVisibilityGlobal - глобальная реплика, т.е. в реплике "видны" все данные из главной реплики (не обязательный параметр)
5. Priority - приоритет реплики. В нашем примере этот параметр опущен. Это значит, что приоритет присваивается автоматически. (не обязательный параметр)
6. Updatability - показывает разрешается ли пользователям менять схему и записи реплицируемых объектов реплики. В нашем примере параметр опущен. Это значит, что разрешаются изменения. (не обязательный параметр).
Давайте рассмотрим какие еще значения могут принимать параметры метода CreateReplica .
ReplicaType может принимать значения
jrRepTypeNotReplicable |
По умолчанию. База данных не реплицируемая. |
jrRepTypeDesignMaster |
Реплика - владелец проекта. |
jrRepTypeFull |
Полная реплика. |
jrRepTypePartial |
Частичная реплика. |
При создании полной реплики импортируются все данные из реплицируемых объектов главной реплики. При создании же частичной - согласно заданному фильтру. При синхронизации данные обновляются также согласно этому фильтру. Если в результате обновления данные поменялись таким образом, что перестают соответствовать фильтру, запись при последующих синхронизациях не обновляется. Вот пример функции, которая создает частичную реплику
Function CreatePartial(strReplicableDBPath As String, strDescription As String)
Dim repFull As New JRO.Replica Dim repPartial As New JRO.Replica Dim strPartialDBPath As String
strPartialDBPath = "C:\<Путь к базе данных>\<Имя файла>" 'получаем имя новой реплики
'Создаем пустую реплику repFull.ActiveConnection = strReplicableDBPath repFull.CreateReplica strPartialDBPath, strDescription, jrRepTypePartial, jrRepVisibilityGlobal
Set repFull = Nothing 'Удаляем переменную с памяти
'Соединяемся с созданной репликой в эксклюзивном режиме repPartial.ActiveConnection = "Data Source=" & strPartialDBPath & ";Mode=Share Exclusive"
'Создаем фильтр на основе таблицы (параметр jrFilterTypeTable)
repPartial.Filters.Append "Клиенты", jrFilterTypeTable, "[Страна] = 'США'" repPartial.Filters.Append "Товары", jrFilterTypeTable, ""
'Создаем фильтр на основе связей между таблицами (параметр jrFilterTypeRelationship)
repPartial.Filters.Append "Заказы", jrFilterTypeRelationship, "КлиентыЗаказы"
'Импоритруем данные согласно фильтра в реплику
repPartial.PopulatePartial strReplicableDBPath
Set repPartial = Nothing 'Удаляем переменную с памяти End Function
Visibility - может принимать значения
JrRepVisibilityGlobal |
Глобальная реплика. |
JrRepVisibilityLocal |
Локальная реплика. |
JrRepVisibilityAnon |
Анонимная реплика. |
Глобальная реплика - это типичная реплика. Она синхронизируется с другими глобальными репликами, ее можно использовать в качестве родительской реплики для создания других реплик.
Локальные и анонимные реплики могут синхронизироваться только с родительскими репликами. Их приоритет всегда равен 0, поэтому, если возникает конфликт при синхронизации, всегда принимаются изменения сделанные в родительской реплике. Если же конфликта нет, то принимаются изменения сделанные в локальной или анонимной реплике. Отличия между локальной и анонимной репликой состоят в следующем. Путь к локальной реплике всегда хранится в главной реплике. Таким образом главная реплика может инициировать синхронизацию с локальной репликой. О местоположении анонимной реплики главной реплике ничего не известно. Поэтому начать процесс синхронизации может только анонимная реплика. Анонимные реплики чаще всего используются для синхронизации через интернет, когда их количество велико, а местоположение не фиксировано. Использование анонимной реплики также позволяет уменьшить размер базы данных.
Priority - это параметр который позволяет установить приоритет реплики. Приоритет реплики - еще одно новшество JRO. Этот параметр введен для того, чтобы показать относительное превосходство одной из реплик во время синхронизации: всегда принимаются изменения, сделанные в реплике с большим приоритетом. Почему относительное превосходство? Потому что, хотя изменения и принимаются, конфликт фиксируется и если он не обработан программно, при последующем обращении к реплике вызывается мастер решения конфликтов. Он позволяет пользователю принять сделанные изменения или отменить их.
Приоритет реплики может принимать значение от 0 до 100 и устанавливается при создании реплики. Владелец проекта имеет приоритет 100. Далее, если при создании глобальной реплики приоритет не указан явно (как в нашем примере) то он принимается равным 90% от приоритета родительской. Как говорилось выше, приоритет локальной и анонимной реплики всегда равен 0. При синхронизации реплик с одинаковым приоритетом принимаются измения, сделанные в той реплике, у которой самый низкий ReplicaID - свойство, которое присваивается реплике автоматически при создании.
Updatability - может принимать значения
jrRepUpdFull |
Реплика может быть обновлена. |
jrRepUpdReadOnly |
Реплика только для чтения. |
По умолчанию принимается значение jrRepUpdFull. Если установлено значение jrRepUpdReadOnly то пользователю не разрешается изменять данные в реплике. Однако при синхронизации с другими репликами изменения данных принимаются.
Третий шаг - синхронизация двух реплик.
Private Function TwoWayDirectSync(strReplica1 As String, strReplica2 As String) Dim repReplica As New JRO.Replica 'определяем переменную с которой в дальнейшем будем производить все действия
repReplica.ActiveConnection = "Data Source=" & strReplica1 & ";Mode=Share Exclusive" 'связываем переменную с репликой strReplica1
repReplica.Synchronize strReplica2, jrSyncTypeImpExp, jrSyncModeDirect 'синхронизируем реплику strReplica1 с репликой strReplica2
Set repReplica = Nothing 'Удаляем переменную с памяти End Function
Метод Synchronize( Target [, SyncType ] [, SyncMode ]) имеет такие параметры:
1. Target - путь к реплике с которой проводим синхронизацию.
2. SyncType - тип синхронизации (не обязательный параметр).
3. SyncMode - режим синхронизации (не обязательный параметр). |