ГлавнаяMS ACCESS AccessConnection и связанные с ним новые возможности
AccessConnection и связанные с ним новые возможности
Автор Вакшуль Сергей
22.03.2002 г.
В Access 2002 появилось новое свойство CurrentProject.AccessConnection. В проекте adp не имеет значения что использовать: CurrentProject.AccessConnection или CurrentProject. Connection, там это равнозначные свойства. Различия проявляются при использовании в базе данных mdb ...
От: Вакшуль Сергей 15.03.2002
AccessConnection и связанные с ним новые возможности форм mdb. В Access 2002 появилось новое свойство CurrentProject.AccessConnection. В проекте adp не имеет значения что использовать: CurrentProject.AccessConnection или CurrentProject. Connection, там это равнозначные свойства. Различия проявляются при использовании в базе данных mdb. Вот что показывает окно отладки(кое-что пропущено для наглядности):
Т.е. 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 XP2002.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 начинают стираться :)
От: Вакшуль Сергей 16.03.2002
Сказанное ранее хочу дополнить результатами дополнительных экспериментов.
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 XP2002.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 XP2002.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:Мои документыdbfProd_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. Набор данных формы, получившей этот рекордсет в качестве источника данных, будет редактируемый.