Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Чем чревато закрытие объекта внутри его With? / 17 сообщений из 17, страница 1 из 1
24.11.2016, 13:37
    #39353613
Lieutenant Pigeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
Собсно сабж...

Давно хотел спросить, но щаз только руки дошли. А ноги выросли осюда: 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
24.11.2016, 13:50
    #39353630
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
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
24.11.2016, 13:55
    #39353637
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
При создании дочернего рекордсета создается полностью новый рекордсет, он уже не связан родительским, так что можно его закрывать без проблем. Где это происходит - внутри With или просто с использованием переменной особой разницы нет, вложенные With также обрабатываются корректно.

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

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

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

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

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

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

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


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

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

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

А как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом?
Без дочек-мам. Эзитселф?
.
...
Рейтинг: 0 / 0
24.11.2016, 14:13
    #39353662
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
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
24.11.2016, 14:35
    #39353683
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
Lieutenant PigeonА как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом?
Не совсем понял вопрос. Если объект был объявлен явно, то если перед End With объект был обнулен, после End With он так и останется со значением Nothing.

Если же объект был создан неявно при вызове With, то если перед выходом мы его насильно обнулим, End With просто еще раз попытается его обнулить, не произойдет ничего.
...
Рейтинг: 0 / 0
24.11.2016, 14:43
    #39353698
Lieutenant Pigeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
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
24.11.2016, 14:51
    #39353718
Lieutenant Pigeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
MrShinLieutenant PigeonА как с ЛЮБЫМ ДРУГИМ самостоятельным, не подчиненным объектом?
Не совсем понял вопрос. Если объект был объявлен явно, то если перед End With объект был обнулен, после End With он так и останется со значением Nothing.

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

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

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

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

* End With просто еще раз попытается его обнулить
Пруфы в студию
Не! Спасибо!
Но, думаю, это вы погорячились :)
.
...
Рейтинг: 0 / 0
24.11.2016, 15:19
    #39353766
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
Lieutenant PigeonLieutenant Pigeonrst2 здесь - дочерний к rst. И закрывается внутри With rst. Вроде бы все нормально. Но иногда, чисто из кода, написания его, возникает необходимость закрыть rst2 внутри его собственного With rst2 .
Что такое дочерний к RST?
Я не знаю такого понятия.
Из вашего кода вообще не следует что rst2 как то относится к rst.
по этому я может и не пойму вашего вопроса.
С уважением.
...
Рейтинг: 0 / 0
24.11.2016, 15:34
    #39353794
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
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
24.11.2016, 16:44
    #39353875
Lieutenant Pigeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
MrShin,
спасибо за наводку.

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

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

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

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

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

MrShin(?)За нас с тобой уже подумали старшие товарищи.
Не доверять им оснований нет.
.
...
Рейтинг: 0 / 0
24.11.2016, 19:07
    #39354041
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
Видимо, да :)
Я, во всяком случае, никогда не нарывался на проблемы с With, на всякий случай еще и проверил перед тем, как написать. МС подтверждает это описанием механизма работы With - объект живет своей жизнью, With держит в стеке только ссылку на этот объект
...
Рейтинг: 0 / 0
25.11.2016, 12:56
    #39354527
POKEP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем чревато закрытие объекта внутри его With?
На мой взгляд, ничОго особлЫвого не произойдёт, если закрыть объект внутри его же 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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Чем чревато закрытие объекта внутри его With? / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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