powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Форма теряет свойства Recordset и RecordsetClone
8 сообщений из 8, страница 1 из 1
Форма теряет свойства Recordset и RecordsetClone
    #39700333
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форма теряет свойства Recordset и RecordsetClone

У меня есть маленькая программка (модуль), которая облегчает подключение таблиц из других баз Access. Всё было хорошо до тех пор пока не пришлось работать с базами, закрытыми паролем.

Для демонстрации проблемы я сделал пример: сама база с программой и две базы с таблицами, одна - с паролем, другая - без
Программка состоит из 3 форм, 3 запросов, 3 таблиц. 3 модулей.
Основная форма - frmSystemBases . При её запуске высвечивается сформированный список баз для подключения.
Внизу есть поле "Путь к базе". Для изменения пути справа от поля есть специальная кнопка.
Установите пути под Ваше размещение файлов баз.
Справа от поля с описанием базы находится чекбокс, который показывает, произведено подключение базы или нет, и две кнопки для подключения и отключения таблиц. После выполнения действий с таблицами вызывается подпрограмма subBookmark которая находится в Module1 . Она обновляет информацию на форме (типа Requery) и устанавливает указатель на ту запись, где он был до этого. Для этого используется свойство формы Recordset .
Но как только Вы попробуете подключить запароленные таблицы, то подпрограмма subBookmark вылетает по ошибке

Код: plaintext
Error 3420 - недопустимый объект или объект более не задан

При просмотре под отладчиком оказывается что форма frmSystemBases теряет свои свойства Recordset и RecordsetClone . Они становятся неопределёнными.
Сами таблицы подключаются. Я думаю, что всё дело в подпрограмме подключения таблиц.
Подключение таблицы незапероленной базы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
'---------------------------------------------------------------------------------------
' Procedure : SetTableRefBaseFull
' DateTime  : 22.01.2007 14:54
' Author    : DSonnyh
' Purpose   : Подключение таблиц с полной проверкой существования таблиц
'---------------------------------------------------------------------------------------
'
Public Sub SetTableRefBaseFull(TName As String, NewTName As String, strBase As String)

   On Error GoTo SetTableRefBaseFull_Error

Dim strCurrentDB As String
strCurrentDB = CurrentProject.FullName
' проверка наличия таблицы в подключаемой базе
   If IsTable(TName, strBase) = 1 Then
' проверка наличия таблицы в текущей базе
        If IsTable(NewTName, strCurrentDB) <> 1 Then
           DoCmd.TransferDatabase acLink, "Microsoft Access", _
           strBase, acTable, TName, NewTName, False, False
        Else
Call MsgBox("В базе " & strCurrentDB _
            & vbCrLf & "уже существует таблица " & NewTName _
            & vbCrLf & "Подключение данной таблицы не проведено!" _
            , vbExclamation, "Подключение таблиц")

        End If
   Else
Call MsgBox("В базе " & strBase _
            & vbCrLf & "отсутствует таблица " & TName _
            & vbCrLf & "Подключение данной таблицы не проведено!" _
            , vbExclamation, "Подключение таблиц")
   
   End If

   On Error GoTo 0
Exit_SetTableRefBaseFull:
   Exit Sub

SetTableRefBaseFull_Error:

    MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре SetTableRefBaseFull в Module modConnect"
    Resume Exit_SetTableRefBaseFull

End Sub


Подключение таблицы незапероленной базы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
'---------------------------------------------------------------------------------------
' Procedure : SetTableRefBasePassFull
' DateTime  : 07.09.2018 14:54
' Author    : DSonnyh
' Purpose   : Подключение запароленных таблиц с полной проверкой существования таблиц
'---------------------------------------------------------------------------------------
'
Public Sub SetTableRefBasePassFull(TName As String, NewTName As String, _
           strBase As String, strPassword As String)

   On Error GoTo SetTableRefBasePassFull_Error

Dim strCurrentDB As String
strCurrentDB = CurrentProject.FullName

    Dim db As DAO.Database
    Dim wRs1 As DAO.Workspace

    Set wRs1 = DBEngine.Workspaces(0)
    Set db = wRs1.OpenDatabase(strBase, False, False, ";PWD=" & strPassword)

' проверка наличия таблицы в подключаемой базе
   If IsTable(TName, strBase) = 1 Then
' проверка наличия таблицы в текущей базе
        If IsTable(NewTName, strCurrentDB) <> 1 Then
           DoCmd.TransferDatabase acLink, "Microsoft Access", _
           "" & db.Name & "", acTable, TName, NewTName, False, False
        Else
Call MsgBox("В базе " & strCurrentDB _
            & vbCrLf & "уже существует таблица " & NewTName _
            & vbCrLf & "Подключение данной таблицы не проведено!" _
            , vbExclamation, "Подключение таблиц")

        End If
   Else
Call MsgBox("В базе " & strBase _
            & vbCrLf & "отсутствует таблица " & TName _
            & vbCrLf & "Подключение данной таблицы не проведено!" _
            , vbExclamation, "Подключение таблиц")
   
   End If
    
    db.Close
    wRs1.Close
    Set db = Nothing
    Set wRs1 = Nothing

   On Error GoTo 0
Exit_SetTableRefBasePassFull:
   Exit Sub

SetTableRefBasePassFull_Error:

    MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре SetTableRefBaseFull в Module modConnect"
    Resume Exit_SetTableRefBasePassFull

End Sub



Для подключения запароленных таблиц мне приходится создавать рабочую область и открывать в ней запароленную базу. Возможно здесь что-то и портится.

Может кто-то что-то посоветует?
-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
Форма теряет свойства Recordset и RecordsetClone
    #39700412
Jossмне приходится создавать рабочую область
Set wRs1 = DBEngine.Workspaces(0) - вы не создаете рабочую область, а получаете ссылку на текущую.
wRs1.Close - а вот это явно лишнее для текущей области (и Set wRs1 = Nothing тоже). Возможно здесь и причина.
...
Рейтинг: 0 / 0
Форма теряет свойства Recordset и RecordsetClone
    #39700435
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,

Если без шелухи, то это точно работает:
Без пароля:
Код: vbnet
1.
2.
DoCmd.TransferDatabase acLink, "Microsoft Access", _
           "C:\tbl\data_bez_parola.mdb", acTable, "t2", "t2", False, False


С паролем:
Код: vbnet
1.
2.
3.
Set dB = Workspaces(0).OpenDatabase("C:\tbl\data_parol.mdb", False, False, "MS Access;PWD=123")
           DoCmd.TransferDatabase acLink, "Microsoft Access", _
           "C:\tbl\data_parol.mdb", acTable, "t1", "t1", False, False



Отличие в том, что с запароленной БД сначала нужно установить связь
...
Рейтинг: 0 / 0
Форма теряет свойства Recordset и RecordsetClone
    #39700438
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кривцов АнатолийJossмне приходится создавать рабочую область
Set wRs1 = DBEngine.Workspaces(0) - вы не создаете рабочую область, а получаете ссылку на текущую.
wRs1.Close - а вот это явно лишнее для текущей области (и Set wRs1 = Nothing тоже). Возможно здесь и причина.
Спасибо. Да Вы правы, это была ссылка на рабочую область и её нельзя было закрывать. Закомментировал две указанные строки и всё заработало.
...
Рейтинг: 0 / 0
Форма теряет свойства Recordset и RecordsetClone
    #39700440
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, у Вас более понятно, лишний Set убирается. После подключения надо закрыть и очистить объект db .
Вопрос, а перед паролем "MS Access;PWD=123" надо писать MS Access или можно опустить?
...
Рейтинг: 0 / 0
Форма теряет свойства Recordset и RecordsetClone
    #39700450
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программа моя болеет избыточным кодом. 50% которого можно выбросить без ущерба для функциональности. Например, у меня целых три подпрограммы подключения таблиц. Или даже 4. Без предварительной проверки наличия таблиц, с проверкой наличия таблиц в базе - получателе, чтоб избежать задвоения, с проверкой наличия таблиц в базе-источнике, чтоб не вылетело по ошибке и с проверкой в обоих базах. Плюс ещё есть дополнительная программа, которая выбирает, которую из подпрограмм подключения запустить в зависимости от входных параметров. А теперь появились подпрограммы с обработкой пароля.
Можно посидеть и убрать всю "воду" из кода.
...
Рейтинг: 0 / 0
Форма теряет свойства Recordset и RecordsetClone
    #39709762
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слегка поизвращался с интерфейсом для accdb. Саму программу можно скачать здесь если интересно.
...
Рейтинг: 0 / 0
Форма теряет свойства Recordset и RecordsetClone
    #39709769
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то не получилось поставить ссылку - исправляюсь http://am.rusimport.ru/MSAccess/topic.aspx?ID=592
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Форма теряет свойства Recordset и RecordsetClone
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]