powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Чем чревато закрытие объекта внутри его With?
17 сообщений из 17, страница 1 из 1
Чем чревато закрытие объекта внутри его With?
    #39353613
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собсно сабж...

Давно хотел спросить, но щаз только руки дошли. А ноги выросли осюда: 19929570

Продублирую для порядку:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
                sSQL = "SELECT [Bp], [Lp], [Ap] FROM " & sTbl & " ORDER BY [RID];"
                Set rst = cdb.OpenRecordset(sSQL, dbOpenDynaset)
                lRecCnt(1) = fn_RecCntRst(rst)
                If lRecCnt(1) = 0 Then Stop
                
                sFlt = "([Bp] > 0 And Len([BP] = " & tDQ & ")) AND " & _
                       "([Ap] > 0 And Len([AP] = " & tDQ & ")) AND " & _
                       "([Lp] = 0)"
                With rst
                    .Filter = sFlt
                    Set rst2 = .OpenRecordset
                    lRecCnt(2) = fn_RecCntRst(rst2)
                    Call sb_Close(rst2)
                End With
                Call sb_Close(rst)



sb_Close - внутри попытка закрыть объект через .Close, а если не поддерживается - то пропустить. На выходе - Set Nothing.

rst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2.

Чем это грозит? Коллизий пока не было... или я прозевал их, или еще как.... но все работает. Однако мало-мало мохаю... переживаю...
.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353630
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lieutenant PigeonСобсно сабж...

Давно хотел спросить, но щаз только руки дошли. А ноги выросли осюда: 19929570

Продублирую для порядку:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
                sSQL = "SELECT [Bp], [Lp], [Ap] FROM " & sTbl & " ORDER BY [RID];"
                Set rst = cdb.OpenRecordset(sSQL, dbOpenDynaset)
                lRecCnt(1) = fn_RecCntRst(rst)
                If lRecCnt(1) = 0 Then Stop
                
                sFlt = "([Bp] > 0 And Len([BP] = " & tDQ & ")) AND " & _
                       "([Ap] > 0 And Len([AP] = " & tDQ & ")) AND " & _
                       "([Lp] = 0)"
                With rst
                    .Filter = sFlt
                    Set rst2 = .OpenRecordset
                    lRecCnt(2) = fn_RecCntRst(rst2)
                    Call sb_Close(rst2)
                End With
                Call sb_Close(rst)




sb_Close - внутри попытка закрыть объект через .Close, а если не поддерживается - то пропустить. На выходе - Set Nothing.

rst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2.

Чем это грозит? Коллизий пока не было... или я прозевал их, или еще как.... но все работает. Однако мало-мало мохаю... переживаю...
.
В теле инструкции With может всегда неожиданно возникнуть исключение.
И до закрытия дело не дойдет.
уничтожать и закрывать объекты желательно в при выходе из процедуры или обработчика ошибок.
Так надежнее.
С уважением.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353637
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При создании дочернего рекордсета создается полностью новый рекордсет, он уже не связан родительским, так что можно его закрывать без проблем. Где это происходит - внутри With или просто с использованием переменной особой разницы нет, вложенные With также обрабатываются корректно.

Я, кстати, всегда закрываю и обнуляю рекодсеты на выходе из процедуры, после On Error Resume Next, этот кусок кода выполняется всегда, в том числе и при ошибках. Если у вас нет еще одного вызова sb_Close на выходе, то в некоторых случаях память будет утекать, не вижу особого смысла в досрочном закрытии рекордсета, если только он заново не открывается после закрытия.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353650
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROIВ теле инструкции With может всегда неожиданно возникнуть исключение.
И до закрытия дело не дойдет.
уничтожать и закрывать объекты желательно в при выходе из процедуры или обработчика ошибок.
Так надежнее.
С уважением.

ROI, ты меня только не пугай - пуганые ужЕ :)
Отвечаешь, как мальчику... обидно даже...

Какие иксепшены?!
Это ж последняя строка внутри With, если уж до нее дело дошло!
После нее - только End With.

Внутри процедуры закрытия единственный лишь зик-хайльеррорхэндлер - на наличие у объекта метода .Close
Все.

Я вижу проблему в том, что, обращаясь к объекту через With, мы его самогО внутри этого обращения трансклюкируем.

И я не уверен в том, что With это чисто компиляторская приблуда, а не исполняемого кода.

К чему будет относиться End With ? !!!!!!!! когда объект ужЕ трасклюкирован?..
.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353659
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lieutenant Pigeon,
Если With используется с объявленной переменной, то с переменной ничего не происходит после End With, а если используется не объявленная переменная, а выражение типа
Код: vbnet
1.
With db.OpenRecordset("...")


То соответственно эта "переменная" трансклюкируется после end with.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353660
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinПри создании дочернего рекордсета создается полностью новый рекордсет, он уже не связан родительским, так что можно его закрывать без проблем. Где это происходит - внутри With или просто с использованием переменной особой разницы нет, вложенные With также обрабатываются корректно.

Я, кстати, всегда закрываю и обнуляю рекодсеты на выходе из процедуры, после On Error Resume Next, этот кусок кода выполняется всегда, в том числе и при ошибках. Если у вас нет еще одного вызова sb_Close на выходе, то в некоторых случаях память будет утекать, не вижу особого смысла в досрочном закрытии рекордсета, если только он заново не открывается после закрытия.

Спасибо. Ну, я примерно понял твое вью про рекордсет.

А как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом?
Без дочек-мам. Эзитселф?
.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353662
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lieutenant PigeonROI, ты меня только не пугай - пуганые ужЕ :)
Отвечаешь, как мальчику... обидно даже...

Какие иксепшены?!
Это ж последняя строка внутри With, если уж до нее дело дошло!
После нее - только End With.
Это вы меня пугаете
Код: vbnet
1.
2.
3.
4.
[/SRC]With rst
                    .Filter = sFlt
                    Set rst2 = .OpenRecordset
                    lRecCnt(2) = fn_RecCntRst(rst2)[SRC VB]


В любой строке может возникнуть исключение и до вашего (Call sb_Close(rst2))
дело не дойдет.
Будьте не так категоричны.
С уважением.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353683
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lieutenant PigeonА как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом?
Не совсем понял вопрос. Если объект был объявлен явно, то если перед End With объект был обнулен, после End With он так и останется со значением Nothing.

Если же объект был создан неявно при вызове With, то если перед выходом мы его насильно обнулим, End With просто еще раз попытается его обнулить, не произойдет ничего.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353698
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROILieutenant PigeonROI, ты меня только не пугай - пуганые ужЕ :)
Отвечаешь, как мальчику... обидно даже...

Какие иксепшены?!
Это ж последняя строка внутри With, если уж до нее дело дошло!
После нее - только End With.
Это вы меня пугаете
Код: vbnet
1.
2.

With rst
.Filter = sFlt
Set rst2 = .OpenRecordset
lRecCnt(2) = fn_RecCntRst(rst2)
Код: vbnet
1.
2.


В любой строке может возникнуть исключение и до вашего (Call sb_Close(rst2))
дело не дойдет.
Будьте не так категоричны.
С уважением.

Lieutenant Pigeonrst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2 .
.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353718
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinLieutenant PigeonА как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом?
Не совсем понял вопрос. Если объект был объявлен явно, то если перед End With объект был обнулен, после End With он так и останется со значением Nothing.

Если же объект был создан неявно при вызове With, то если перед выходом мы его насильно обнулим, End With просто еще раз попытается его обнулить, не произойдет ничего.

* объект был создан неявно при вызове With
Явно и задолго до With

* после End With он так и останется со значением Nothing
Меня очень интересут не судьба объектной переменной и не значение ее после...

А - что произойдет
М Е Ж Д У присвоением ей Nothing после Close (если таковое возможно) и End With

* End With просто еще раз попытается его обнулить
Пруфы в студию
Не! Спасибо!
Но, думаю, это вы погорячились :)
.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353766
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lieutenant PigeonLieutenant Pigeonrst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2 .
Что такое дочерний к RST?
Я не знаю такого понятия.
Из вашего кода вообще не следует что rst2 как то относится к rst.
по этому я может и не пойму вашего вопроса.
С уважением.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353794
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lieutenant Pigeonчто произойдет
М Е Ж Д У присвоением ей Nothing после Close (если таковое возможно) и End With
Ровным счетом ничего. После присвоения переменной Nothing, она так и остается Nothing и до End With и после, можете проэкспериментировать.

Физически при вызове With происходит следующее: ссылка на существующий объект помещается в СТЕК, а не в общую память. Соответственно при End With эта ссылка просто выталкивается из стека и исчезает из области видимости. Именно поэтому нельзя в принципе обнулить неявно созданную переменную внутри With, я действительно погорячился с завлением о том, With попытается еще раз обнулить - до этого не дойдет, ибо доступа к стеку на запись нет, только чтение. В языке даже нет конструкции, позволяющей получить неявную переменную - просто точку не воспринимает еще компилятор.

Вот здесь есть некоторые подробности: https://msdn.microsoft.com/en-us/library/wc500chb.aspx
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39353875
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,
спасибо за наводку.

Прочел как мог. Оказывается читал уже. Немного мимо интересующей меня механики - но полезно освежиться.

На данном этапе обсуждения меня ужЕ скилл подводит :(

Давай упростимся. Скажи, какое из утверждений ты, лично, приемлешь для себя:

1. Не допускать закрытия объекта внутри обращения к нему через With
2. Наплявать... -вать... -вать...

Вот, как писали бы мы с тобой Устав караульной службы, скажем... что бы написали?
.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39354014
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lieutenant Pigeon2. Наплявать... -вать... -вать..
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39354019
Фотография Lieutenant Pigeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinLieutenant Pigeon2. Наплявать... -вать... -вать..
С твоего позволения, могу ли я это проинтерпретировать, как:

MrShin(?)За нас с тобой уже подумали старшие товарищи.
Не доверять им оснований нет.
.
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39354041
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видимо, да :)
Я, во всяком случае, никогда не нарывался на проблемы с With, на всякий случай еще и проверил перед тем, как написать. МС подтверждает это описанием механизма работы With - объект живет своей жизнью, With держит в стеке только ссылку на этот объект
...
Рейтинг: 0 / 0
Чем чревато закрытие объекта внутри его With?
    #39354527
POKEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На мой взгляд, ничОго особлЫвого не произойдёт, если закрыть объект внутри его же With. :-)

Я обычно так и открываю/закрываю аналогичные рекорсеты, файлсистемобжекты и прочую объектную мелочёвку. То есть, примерно так:

Код: 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.
'
lRd = nz(Me.RecID.Value, 0)

'Новый объект с набором записей.
Set rRs = New ADODB.Recordset

'Обработать объект.
With rRs

    'Открыть объект ТОЛЬКО ДЛЯ ЧТЕНИЯ сверху вниз один раз.
    .Open "SELECT Согласовано FROM dbo_Согласования_Main WHERE РеестрКД_ID = " & lRd, _
        CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly

    'Проверка наличия записей.
    If Not (.BOF And .EOF) Then

'''''' ... Всякие разные ужасные действия. Категория 18+. И выше.

    End If

    'Закрыть объект.
    .Close

End With

'Зачистка.
Set rRs = Nothing



Ну и в обработчике ошибок (если оно вдруг так получилось) трансклюкирую объект ещё раз на всякий случай, предварительно указав On Error Resume Next.

Тоже того... переживаю, когда такое случается, но всё мало-мало работает, однако. ))

Работаю сейчас в Access10 (32 разряда). У пользователей - рантайм разных версий, от 2003 до 2013.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Чем чревато закрытие объекта внутри его With?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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