Описание:
Автор: Вакшуль Сергей
Добавил на сайт: Вакшуль Сергей 03.04.2002
В Access 2002 появилось новое свойство
CurrentProject.AccessConnection.
В
проекте adp не
имеет
значения
что
использовать: CurrentProject.AccessConnection
или
CurrentProject. Connection,
там это равнозначные свойства.
Различия проявляются при использовании в базе данных mdb. Вот что показывает
окно отладки(кое-что пропущено для наглядности):
? CurrentProject.Connection
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data
Source=D:\Мои
документы\Access XP\2002.mdb
? CurrentProject.AccessConnection
Provider=Microsoft.Access.OLEDB.10.0;Persist Security
Info=False;Data Source=D:\Мои документы\Access
XP\2002.mdb;User ID=Admin;Data Provider=Microsoft.Jet.OLEDB.4.0
Т.е. CurrentProject.Connection использует только
одного
провайдера – Microsoft Jet OLEDB provider. А CurrentProject.AccessConnection использует
двух
провайдеров: одного
для
доступа
к
данным(параметр
в
строке
подключения Data Provider) и другого сервис
провайдера
- Microsoft.Access.OLEDB.10.0. Вот этот самый другой и
является сутью новшества.
Про ограничения нового сервис провайдера говорить не буду, хочу выделить только
достоинства. С появлением в Access 2000 свойства формы Recordset, появилась
возможность указать форме в качестве источника данных рекордсет DAO/ADO. Однако
редактировать через интерфейс формы можно было только рекордсет DAO. Так вот,
появление нового свойства CurrentProject.AccessConnection, а если говорить более обобщенно,
нового сервис провайдера Microsoft.Access.OLEDB.10.0, сняло это ограничение в
Access 2002. Теперь для того, чтоб указать форме в качестве источника данных
рекордсет ADO, который будет обновляемым через интерфейс формы, необходимо
чтобы Connection, в котором будет
открыт этот рекордсет, использовал не только провайдера данных, но и сервис
провайдера Microsoft.Access.OLEDB.10.0. Частным случаем этого правила является
свойство CurrentProject.AccessConnection. Его удобно применять
для открытия рекордсетов ADO, по таблицам текущей базы данных, с последующей их
передачей формам в качестве источника данных.
Информации из MSDN по свойству CurrentProject.AccessConnection хватило для того, чтобы, поняв суть
нововведения, использовать ее для работы с источниками данных, не
присоединенными к базе данных, т.е. там, где CurrentProject.AccessConnection не может быть применен.
Привожу два примера, демонстрирующих использование в формах Access 2002
редактируемых рекордсетов ADO по разным источникам данных:
Sub Кmdb()
'Пример
подключения к другому mdb через отдельный Connection
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=Microsoft.Access.OLEDB.10.0;Persist
Security Info=False;Data Source=D:\Мои документы\Access XP\2002.mdb;User
ID=Admin;Data Provider=Microsoft.Jet.OLEDB.4.0"
con.Open
rst.Open "Table1",
con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
End Sub
Sub КSQL()
'Пример подключения
к SQL Server через отдельный
Connection
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=Microsoft.Access.OLEDB.10.0;Persist
Security Info=False;Data Source=VAKSHUL;User ID=sa;Initial Catalog=Динамика;Data Provider=SQLOLEDB.1"
con.Open
rst.Open
"Table1", con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
End Sub
Результаты экспериментов не могут не радовать. Добавлю, что в процессе
эксперимента рекордсет формы проекта adp был присвоен в качестве источника
данных формы библиотечной базы mdb, и его по-прежнему можно было редактировать.
Похоже, границы между mdb и adp начинают стираться :)
Сказанное
ранее хочу дополнить результатами дополнительных экспериментов.
1.
Имеется «родная» mdb таблица. Таблица имеет первичный ключ.
Подключение через ADO к этой таблице, создав новый конекшн или используя CurrentProject.AccessConnection, дает одинаковый
результат – результирующий набор в форме редактируемый.
_________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=Microsoft.Access.OLEDB.10.0;Persist Security
Info=False;Data Source=D:\Мои документы\Access XP\2002.mdb;User ID=Admin;Data
Provider=Microsoft.Jet.OLEDB.4.0"
con.Open
rst.Open "Table2",
con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
___________
___________
Dim rst As New ADODB.Recordset
rst.Open "Table2", CurrentProject.AccessConnection, adOpenKeyset,
adLockOptimistic
Set Me.Recordset = rst
___________
Удалим в таблице первичный ключ.
Результат в обоих способах подключения одинаковый - результирующий набор в
форме Не редактируемый.
2.
Имеется не присоединенная к mdb базе таблица SQL Sever. Таблица имеет первичный
ключ.
Подключение через ADO к этой таблице в результате дает редактируемый набор в
форме.
___________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=Microsoft.Access.OLEDB.10.0;Persist
Security Info=False;Data Source=VAKSHUL;User ID=sa;Initial
Catalog=Динамика;Data Provider=SQLOLEDB.1"
con.Open
rst.Open "tbl", con,
adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
___________
Удалим в таблице первичный ключ.
Результат подключения через ADO к этой таблице в результате дает НЕ
редактируемый набор в форме.
3.
Имеется присоединенная к mdb базе таблица формата dbf. При присоединении было
указано поле, выполняющего функцию поля первичного ключа.
Подключение через ADO к этой таблице, создав новый конекшн или используя CurrentProject.AccessConnection, дает одинаковый
результат – результирующий набор в форме редактируемый.
__________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=Microsoft.Access.OLEDB.10.0;Persist
Security Info=False;Data Source=D:\Мои документы\Access
XP\2002.mdb;User ID=Admin;Data Provider=Microsoft.Jet.OLEDB.4.0"
con.Open
rst.Open "comptyp", con, adOpenKeyset,
adLockOptimistic
Set Me.Recordset = rst
__________
__________
Dim rst As New
ADODB.Recordset
rst.Open "comptyp", CurrentProject.AccessConnection,
adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
__________
Переприсоединим таблицу dbf к базе без указания поля первичного ключа.
Результат в обоих способах подключения одинаковый - результирующий набор в
форме Не редактируемый.
4.
Имеется не присоединенная к mdb базе таблица dbf. Таблица, естественно, не
имеет первичного ключа.
Подключение через ADO к этой таблице в результате дает HE редактируемый набор в
форме.
____________
Dim rst As New ADODB.Recordset
Dim con As New ADODB.Connection
con.ConnectionString = "Provider=Microsoft.Access.OLEDB.10.0;Data
Provider=MSDASQL.1;Extended Properties=""DSN=Belch_dbf;UID=;PWD=;SourceDB=D:\Мои
документы\dbf\Prod_dbfs;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"""
con.Open
rst.Open
"select * from comptyp", con, adOpenKeyset, adLockOptimistic
Set Me.Recordset = rst
_____________
Прослеживается
совершенно
четкая
закономерность. Таблица,
имеющая первичный ключ, или то, что может трактоваться как первичный ключ,
является обновляемой через интерфейс формы и не обновляемой при отсутствии
такового.
Я не знаю, может возможности нового сервис провайдера и
ограничены, и пока он позволяет редактировать данные в формах, основанные на
рекордсетах ADO только избранных поставщиков данных, но в любом случае нужную
таблицу можно будет присоединить к mdb файлу и открыть ADO-шный рекордсет уже
по ней, использовал в качестве конекшн CurrentProject.AccessConnection. Набор данных формы,
получившей этот рекордсет в качестве источника данных, будет редактируемый.
Вакшуль
Сергей
ТАКЖЕ
ОПУБЛИКОВАНО НА КМ: http://msa.km.ru/msa/access/article.asp?id=367
[Back]