В 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. Набор данных формы, получившей этот рекордсет в качестве источника данных, будет редактируемый.